【问题标题】:Use of overriding getPreferredSize() instead of using setPreferredSize() for fixed size Components使用覆盖 getPreferredSize() 而不是 setPreferredSize() 用于固定大小的组件
【发布时间】:2012-06-07 16:01:34
【问题描述】:

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

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

而不是

setPreferredSize(new Dimension(500, 500));

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

【问题讨论】:

  • 感谢您的链接。尽管在顶部答案中提到的一篇文章中说“永远不要使用这种方法[setPreferredSize]!!!”有点奇怪。因为我从来没有遇到过任何问题。但话说回来,我从来没有写过真正大/复杂的 UI。
  • 这是关于顶级编程的 :-),但是要建议如何避免错误,没有人说使用 LayoutManager 很容易,需要 a) 学习和尝试,b) 询问一些问题

标签: java swing layout-manager


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢@AndrewThompson,是的,这是真的——我试图改变我的答案以更好地反映这一点。我的意图是它是一种更严格的设置组件大小的方法,但不一定能保证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 2018-04-07
  • 2010-11-25
  • 2016-12-17
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
相关资源
最近更新 更多