我在这里阅读了一些帖子,我开始为什么有些人会这样做
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
而不是
setPreferredSize(new Dimension(500, 500));
第二个不是更好,因为它只创建一个Dimension
对象,而第一个可能创建几个(即使它没有那么多浪费的内存)?还是我错了?有什么区别吗?
答案 0 :(得分:14)
一个很大的区别是价值如何随时间变化,所以你选择的那个应该取决于你想要用代码做什么。
如果您只是在代码中调用setPreferredSize(new Dimension(500, 500));
,它会按预期执行 - 它会将首选大小设置为500x500。但是,应用程序中的其他代码可能会使用新值覆盖此值 - 任何内容都可以调用setPreferredSize()
,最后一次调用此方法将是最终结果。
但是,如果您在代码中覆盖getPreferredSize()
方法,则始终将返回500x500。如果您的任何代码调用setPreferredSize()
方法,则无关紧要,因为它们实际上被忽略了。如果您还覆盖getMinimumSize()
和getMaximumSize()
,则可以在组件上强制使用固定大小,无论窗口大小和其他组件如何,都不应更改。
然而,正如@Andrew Thompson在评论中所提到的,这并不能保证,因为一些布局管理员可以选择忽略这些,特别是如果您正在编写自己的布局管理器,并将自定义组件添加到某些父容器也会忽略这些方法,具体取决于组件的使用位置和方式。无论如何,它仍然比调用setPreferredSize()
更加严格,getPreferredSize()
很容易被其他代码调用并被完全覆盖。
我还为我的任何自定义组件覆盖getMinimumSize()
方法(加getMaximumSize()
和JFrame
),例如需要具有组件特定尺寸的颜色选择器画得很好。如果不重写这些方法,Swing布局管理器就无法理解如何根据JPanel
或{{1}}的大小来定位和调整自定义组件的大小。