15

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

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

代替

setPreferredSize(new Dimension(500, 500));

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

4

1 回答 1

14

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

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

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

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

我还为我的任何自定义组件覆盖了getPreferredSize()方法(加号getMinimumSize()getMaximumSize()),例如需要具有特定尺寸才能正确绘制组件的颜色选择器。在不覆盖这些方法的情况下,Swing 布局管理器不了解如何根据JFrameor的大小来适当地定位和调整您的自定义组件JPanel

于 2012-06-03T06:51:53.473 回答