该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
>>> 常见的LayoutManager —— BorderLayout
BorderLayout 比较负责任,它把整个容器的长方形区域划分成了五块,用一些 String 的 key 来记录每一块的位置: CENTER, NORTH, SOUTH, WEST, EAST
对于第一件事,BorderLayout是这么做的:
如果 NORTH 和 SOUTH 位置有控件,把它们拿出来,问它们喜欢的高度是多少,宽度必须是容器宽度,加进去分别放到顶上和底部,然后“可用的空间”减掉这两部分。然后如果 WEST 和 EAST 有控件,问它们喜欢的宽度是多少,高度必须是“当前剩余可用空间”的高度,加进去分别加到左边和右边,然后CENTER填充剩余的部分。
第二件事,根据控件的位置把它们喜欢的宽度或高度相加,算出整个容器喜欢的大小。
另外BorderLayout也支持几个其他的 key 比如 BEFORE_FIRST_LINE 等等,用的比较少可以自己参照API文档。
这里可以回答一个新手问题:
我有一个 JPanel 加进了 JScrollPane 里面,然后 jframe.add(jscrollpane),然后 jframe.pack() ,为什么不出现滚动条呢?
答:
JScrollPane 有它自己的 LayoutManager,这个LayoutManager在第二件事上尊重加进来的控件的 getPreferredSize(),所以当 jframe.pack() 的时候,JScrollPane 说: 我内部那个 JPanel 喜欢的size就是我喜欢的size。于是JPanel正好被完全显示,而 JScrollPane 默认的行为是“如果不需要就不要显示滚动条”。
这里要注意的是 jframe.add(jscrollpane); 相当于 jframe.getContentPane().add(jscrollpane, BorderLayout.CENTER);