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

Ich*_*aum 15 java swing layout-manager

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

@Override
public Dimension getPreferredSize() {
    return new Dimension(500, 500);
}
Run Code Online (Sandbox Code Playgroud)

代替

setPreferredSize(new Dimension(500, 500));
Run Code Online (Sandbox Code Playgroud)

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

wat*_*ios 14

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

如果您只是调用setPreferredSize(new Dimension(500, 500));代码,它将按预期执行 - 它将首选大小设置为500x500.但是,应用程序中的其他代码可能会使用新值覆盖此值 - 任何可以调用的内容都setPreferredSize()将最终调用此方法.

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

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

我还覆盖了我的任何自定义组件的getPreferredSize()方法(加号getMinimumSize()getMaximumSize()),例如颜色选择器需要具有正确绘制的组件的特定尺寸.如果不重写这些方法,Swing布局管理不明白你的自定义组件如何定位和的大小合适的尺寸JFrameJPanel.