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

时间:2012-06-02 23:38:37

标签: java swing layout-manager

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

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

而不是

setPreferredSize(new Dimension(500, 500));

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

1 个答案:

答案 0 :(得分:14)

一个很大的区别是价值如何随时间变化,所以你选择的那个应该取决于你想要用代码做什么。

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

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

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

我还为我的任何自定义组件覆盖getMinimumSize()方法(加getMaximumSize()JFrame),例如需要具有组件特定尺寸的颜色选择器画得很好。如果不重写这些方法,Swing布局管理器就无法理解如何根据JPanel或{{1}}的大小来定位和调整自定义组件的大小。