setPreferredSize的副作用是什么?

时间:2011-02-24 10:01:25

标签: java swing

我有包含多个面板的窗口。我无权访问窗口代码。 (我只能修改面板的代码。)

我从面板中删除了一些组件。窗户缩小了它的尺寸。但窗口太小,无法正确显示所有内容。

我添加了行setPreferredSize(getPreferredSize());。现在窗口大小合适。

setPreferredSize的副作用是什么?

编辑:使用BorderLayout。哪个应该忽略getXXXSize()。我的小组在CENTER。不适合屏幕的面板位于NORTH。

3 个答案:

答案 0 :(得分:3)

这就是发生的事情:

  • getPreferredSize()查看之前是否设置了大小。如果没有,该方法会向LayoutManager询问组件本身(这是您的JPanel)的首选大小,然后根据组件计算。
  • setPreferredSize(...)然后在JPanel上设置此值,并将其记忆以供日后使用。
  • 稍后您将删除JPanel的一些组件。
  • 即使稍后,当窗口尝试重新布局时(或被告知这样做),窗口(或contentpane的/ RootPane的/ ...)Layoutmanager再次调用JPanel的getPreferredSize()方法。
  • 现在getPreferredSize()不会询问JPanel的LayoutManager,而只返回先前由setPreferredSize()设置的存储大小。

对于宽度,BorderLayout忽略了NORTH和South组件的首选宽度,它只考虑CENTER,EAST和WEST。 (同样适用于身高)。

我刚刚看了BorderLayout.preferredLayoutSize的实现(在Sun的1.6.0_13中),它的工作方式如下:

宽度计算为

max(  EAST.width + CENTER.width + WEST.width + h-gaps,
      NORTH.width, SOUTH.width ) + insets

高度计算为

max( EAST.height, CENTER.height, WEST.height)
+ NORTH.height + SOUTH.height + v-gaps + insets

width / height中的每一个都是这些组件preferredSize的值。) 如果缺少五个组件中的一些,则不包括它们的高度/宽度,也不包括间隙。)

minimalLayoutSize的效果相同,而maximumLayoutSize只返回Integer.MAX_VALUE

因此,原则上它应该开箱即用。

但一般情况下,如果窗口的布局不在您的控制之下,您不必担心不受您控制的组件被切断: - )

答案 1 :(得分:2)

,它有很多效果。效果取决于

  1. 正在使用的布局管理器
  2. 设置了首选大小的组件。
  3. 主要原因是一旦你调用setPreferredSize()来设置大小,组件将不再要求ui获得首选大小。理想情况下,只有组件的ui委托知道组件的理想pref大小。一旦你自己设置了pref大小,就不会查询ui的pref大小。

    为清楚起见,请参阅Jcomonent.getPreferredSize()代码:

        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        Dimension size = null;
        if (ui != null) {
            size = ui.getPreferredSize(this);
        }
    

    现在为什么它依赖于layout-manager,因为只有一些布局调用(使用) getPreferredSize()进行计算。例如,flowlayout使用pref大小但边框布局不是

答案 2 :(得分:0)

方法setPreferredSize()是无副作用的。

Suraj Chandran描述了getPreferredSize()的工作原理。

为什么setPreferredSize(getPreferredSize())工作由PaŭloEbermann解释。