使用重写getPreferredSize()而不是对固定大小的组件使用setPreferredSize()

我在这里读了一些post,我开始为什么有些人这样做

@Override public Dimension getPreferredSize() { return new Dimension(500, 500); } 

代替

 setPreferredSize(new Dimension(500, 500)); 

不是第二个更好,因为它只创建一个Dimension对象,而第一个可能创建几个(即使它没有那么多浪费的内存)? 或者我错了? 有什么区别吗?

一个很大的区别是值如何随时间变化,因此您选择的那个应该取决于您想要对代码执行的操作。

如果你只是调用setPreferredSize(new Dimension(500, 500)); 在您的代码中,它将按预期执行 – 它将首选大小设置为500×500。 但是,应用程序中的其他代码可能会使用新值覆盖此值 – 任何东西都可以调用setPreferredSize() ,最后一次调用此方法将是最终结果。

但是,如果在代码中覆盖getPreferredSize()方法,它将始终返回500×500。 如果您的任何代码调用setPreferredSize()方法并不重要,因为它们被有效地忽略。 如果还重写了getMinimumSize()getMaximumSize() ,则可以在组件上强制使用固定大小,无论窗口大小和其他组件如何,都不应更改。

但是,正如@Andrew Thompson在评论中提到的那样,这并不能保证,因为一些布局管理器可以选择忽略这些,特别是如果你正在编写自己的布局管理器,并且向一些父容器添加自定义组件也会忽略这些方法取决于组件的使用位置和方式。 无论如何,它仍然比调用setPreferredSize()更加严格,后者很容易被其他代码调用并被完全覆盖。

我还为任何自定义组件覆盖了getPreferredSize()方法(加上getMinimumSize()getMaximumSize() ),例如颜色选择器需要具有正确绘制的组件的特定尺寸。 如果不重写这些方法,Swing布局管理器就无法理解如何根据JFrameJPanel的大小来定位和调整自定义组件的大小。