这些Java教程是为JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,可能使用已不再可用的技术。
请参阅Java语言更改以获取Java SE 9及其后续版本中更新的语言功能的概述。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
正如我们之前提到的,Swing提供了三个通常有用的顶级容器类:JFrame
、JDialog
和JApplet
。在使用这些类时,您应该记住以下几点:
这是一个应用程序创建的框架的图片。该框架包含一个绿色的菜单栏(没有菜单),并且在框架的内容面板中有一个大的空白黄色标签。
|
|
您可以在TopLevelDemo.java
中找到此示例的完整源代码。尽管该示例在一个独立的应用程序中使用了JFrame
,但相同的概念也适用于JApplet
和JDialog
。
这是此示例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
方法及其变体,remove
和setLayout
已经被重写,以根据需要转发给contentPane
。这意味着你可以写
frame.add(child);
并且子组件将被添加到contentPane
。
注意,只有这三个方法会这样做。这意味着getLayout()
不会返回使用setLayout()
设置的布局。
理论上,所有的顶级容器都可以容纳一个菜单栏。然而,在实践中,菜单栏通常只出现在框架和小程序中。要向顶级容器添加菜单栏,创建一个JMenuBar
对象,填充菜单,然后调用setJMenuBar
。使用以下代码,TopLevelDemo
向其框架添加了一个菜单栏:
frame.setJMenuBar(greenMenuBar);
有关实现菜单和菜单栏的更多信息,请参阅使用菜单。
每个顶级容器都依赖于一个名为root pane的封闭中间容器。根窗格管理内容窗格和菜单栏,以及其他几个容器。使用Swing组件时通常不需要了解根窗格。但是,如果您需要拦截鼠标点击或在多个组件上进行绘制,您应该熟悉根窗格。
以下是根窗格提供给框架(以及其他每个顶级容器)的组件列表:
我们已经告诉您了关于内容窗格和可选菜单栏的信息。根窗格添加的另外两个组件是分层窗格和玻璃窗格。分层窗格包含菜单栏和内容窗格,并允许对其他组件进行Z顺序排列。玻璃窗格通常用于拦截发生在顶级容器上的输入事件,并且也可以用于在多个组件上进行绘制。
有关详细信息,请参阅如何使用根窗格。