这就是正在发生的事情:
-
getPreferredSize()
查看之前是否设置过尺寸。如果没有,该方法会向组件本身(即您的 JPanel)的 LayoutManager 询问首选尺寸,然后根据组件计算该尺寸。
-
setPreferredSize(...)
然后在 JPanel 上设置该值,并记住它以供以后使用。
- 稍后您将删除 JPanel 的一些组件。
- 甚至稍后,当窗口尝试重新布局自身(或被告知这样做)时,窗口的(或 contentpane 的/RootPane 的/...)Layoutmanager 会调用 JPanel 的
getPreferredSize()
再次方法。
- now
getPreferredSize()
不询问 JPanel 的 LayoutManager,而只是返回先前设置的存储大小setPreferredSize()
.
For width, the BorderLayout is ignoring the preferred width of the NORTH and south component, it only takes CENTER, EAST and WEST into account. (Similarly for height).
我只是看了一下实施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
, while maximumLayoutSize
只是返回Integer.MAX_VALUE
.
因此,原则上它应该开箱即用。
但一般来说,如果窗口的布局不在您的控制之下,您不必担心不在您控制的组件被切断:-)