文档

Java™ 教程
隐藏目录
使用顶级容器
导航: 使用Swing创建GUI
课程: 使用Swing组件

使用顶级容器

正如我们之前提到的,Swing提供了三个通常有用的顶级容器类:JFrameJDialogJApplet。在使用这些类时,您应该记住以下几点:


注意: JInternalFrame虽然模仿了JFrame,但内部框架实际上不是顶级容器。

这是一个应用程序创建的框架的图片。该框架包含一个绿色的菜单栏(没有菜单),并且在框架的内容面板中有一个大的空白黄色标签。

一个简单的应用程序,其中包含一个带有菜单栏和内容面板的框架。
框架的主要部分的图示

您可以在TopLevelDemo.java中找到此示例的完整源代码。尽管该示例在一个独立的应用程序中使用了JFrame,但相同的概念也适用于JAppletJDialog

这是此示例GUI的容器层次结构:

TopLeveDemo示例的GUI的容器层次结构。

正如省略号所示,我们在此图中省略了一些细节。稍后我们将逐步揭示这些细节。本节讨论以下主题:

顶级容器和容纳层次结构

使用Swing组件的每个程序至少有一个顶级容器。这个顶级容器是容纳层次结构的根节点-包含所有出现在顶级容器内部的Swing组件的层次结构。

一般来说,一个使用Swing GUI的独立应用程序至少有一个包含有JFrame作为其根节点的容纳层次结构。例如,如果一个应用程序有一个主窗口和两个对话框,那么该应用程序有三个容纳层次结构,因此有三个顶级容器。一个容纳层次结构以JFrame作为其根节点,另外两个容纳层次结构以JDialog对象作为其根节点。

一个基于Swing的小程序至少有一个容纳层次结构,其中恰好一个以JApplet对象作为其根节点。例如,弹出一个对话框的小程序有两个容纳层次结构。浏览器窗口中的组件位于以JApplet对象作为根节点的容纳层次结构中。对话框具有以JDialog对象作为根节点的容纳层次结构。

将组件添加到内容面板

以下是前面示例中使用的代码,用于获取框架的内容面板并将黄色标签添加到其中:

frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);

代码显示,通过调用getContentPane方法,您可以找到顶级容器的内容面板。默认的内容面板是一个简单的中间容器,它继承自JComponent,并使用BorderLayout作为其布局管理器。

很容易自定义内容面板-设置布局管理器或添加边框,例如。然而,有一个小小的注意事项。getContentPane方法返回一个Container对象,而不是JComponent对象。这意味着,如果要利用内容面板的JComponent特性,需要对返回值进行强制类型转换或创建自己的组件作为内容面板。我们的示例通常采用第二种方法,因为它更清晰。我们有时候还会采用另一种方法,即直接向内容面板添加一个自定义组件,完全覆盖内容面板。

请注意,JPanel的默认布局管理器是FlowLayout;您可能需要更改它。

要将组件设置为内容窗格,使用顶级容器的setContentPane方法。例如:

//创建一个面板并向其中添加组件。
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(someBorder);
contentPane.add(someComponent, BorderLayout.CENTER);
contentPane.add(anotherComponent, BorderLayout.PAGE_END);


topLevelContainer.setContentPane(contentPane);

注意: 

为了方便起见,add方法及其变体,removesetLayout已经被重写,以根据需要转发给contentPane。这意味着你可以写

frame.add(child);

并且子组件将被添加到contentPane

注意,只有这三个方法会这样做。这意味着getLayout()不会返回使用setLayout()设置的布局。


添加菜单栏

理论上,所有的顶级容器都可以容纳一个菜单栏。然而,在实践中,菜单栏通常只出现在框架和小程序中。要向顶级容器添加菜单栏,创建一个JMenuBar对象,填充菜单,然后调用setJMenuBar。使用以下代码,TopLevelDemo向其框架添加了一个菜单栏:

frame.setJMenuBar(greenMenuBar);

有关实现菜单和菜单栏的更多信息,请参阅使用菜单

根窗格

每个顶级容器都依赖于一个名为root pane的封闭中间容器。根窗格管理内容窗格和菜单栏,以及其他几个容器。使用Swing组件时通常不需要了解根窗格。但是,如果您需要拦截鼠标点击或在多个组件上进行绘制,您应该熟悉根窗格。

以下是根窗格提供给框架(以及其他每个顶级容器)的组件列表:

根窗格管理四个其他窗格:分层窗格、菜单栏、内容窗格和玻璃窗格。

我们已经告诉您了关于内容窗格和可选菜单栏的信息。根窗格添加的另外两个组件是分层窗格和玻璃窗格。分层窗格包含菜单栏和内容窗格,并允许对其他组件进行Z顺序排列。玻璃窗格通常用于拦截发生在顶级容器上的输入事件,并且也可以用于在多个组件上进行绘制。

有关详细信息,请参阅如何使用根窗格


上一页:使用Swing组件
下一页:JComponent类