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

2022-09-03 14:59:09

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

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

而不是

setPreferredSize(new Dimension(500, 500));

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


答案 1

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

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

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

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

我还覆盖了我的任何自定义组件的方法(plus和),例如需要具有特定尺寸才能正确绘制组件的颜色选取器。如果不重写这些方法,Swing 布局管理器将无法理解如何针对 or 的大小对自定义组件进行适当的定位和调整大小。getPreferredSize()getMinimumSize()getMaximumSize()JFrameJPanel


答案 2

推荐