在进行GUI编写时,经常会遇到这几个类。它们之间的关系是怎么样的呢?这需要从包含层次(containment hierarchy)说起。以下内容参考java tutorials。
Swing库提供了3个顶层容器类(Top-Level container class): JFrame, JDialog, JApplet。在创建GUI时应该遵循以下原则:
- 要显示在屏幕上,每个GUI部件必须在一个树状的包含层次里,这个树的根必须是三个顶层容器类之一。
- 一个部件只能被包含一次
- 每个顶层容器内含有一个内容层(content pane),部件就在这个里面被显示。
- 顶层容器还包含一个菜单栏,菜单栏在内容层之外,与其并列。
这是一个示意图:
其实,对于JFrame进一步细分,可以得到如下结构:
可以看到包含有4个层次,分别为Root Pane, Layered Pane, Content Pane及可选的Menu Bar和Glass Pane. 它们在对窗体进行一些特殊处理的时候是有用的。
总结
JFrame作为顶层容器,包含了content pane和menu bar。 JPanel可以被设置为content pane用于存放JComponent。
如何添加component到content pane
有几种方法:
使用JFrame的getContentPane()方法获取content pane,再调用add()方法。
frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);
需要注意:getContentPane()返回值为Container, 那么就不能利用JComponent的一些特性了。如要需要使用,要强制类型转换。自定义JPanel后设置为content pane.
//Create a panel and add components to it.
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(someBorder);
contentPane.add(someComponent, BorderLayout.CENTER);
contentPane.add(anotherComponent, BorderLayout.PAGE_END);
topLevelContainer.setContentPane(contentPane);
- 直接使用Frame的add方法, 方法会自动添加到content pane中。
Frame.add(child)
需要注意:能采用这种方式操作content pane的函数只有add, remove和setLayout
如何添加menubar
直接使用以下函数。
frame.setJMenuBar(greenMenuBar);