使用顶级容器
正如我们前面提到的,Swing提供了三个大致有用的顶层容器类:JFrame
,JDialog
,和JApplet
。使用这些类时,您应该牢记以下事实:
-
要在屏幕上显示,每个GUI组件都必须是包含层次结构的一部分。包含层次结构是一个组件树,其顶层容器作为其根。我们会向您展示一个。
-
每个GUI组件只能包含一次。如果组件已经在容器中并且您尝试将其添加到另一个容器,则该组件将从第一个容器中删除,然后添加到第二个容器中。
-
每个顶级容器都有一个内容窗格,一般来说,它包含(直接或间接)该顶级容器GUI中的可见组件。
-
您可以选择将菜单栏添加到顶级容器。按照惯例,菜单栏位于顶级容器内,但位于内容窗格之外。一些外观和感觉,例如Mac OS的外观和感觉,让您可以选择将菜单栏放在更适合外观的另一个地方,例如屏幕顶部。
这是应用程序创建的框架的图片。该框架包含一个绿色菜单栏(没有菜单),并在框架的内容窗格中包含一个大的空白黄色标签。
package 使用顶级容器;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
public class TopLevelDemo {
private static void createAndShowGUI() {
//创建并设置窗口
JFrame frame=new JFrame("顶级容器");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//成绩菜单栏,让它有一个绿色的背景
JMenuBar greenMenuBar=new JMenuBar();
greenMenuBar.setOpaque(true);
//设置菜单栏背景为绿色
greenMenuBar.setBackground(new Color(154,165,127));
greenMenuBar.setPreferredSize(new Dimension(200,20));
//创建一个黄色标签以放入内容窗格
JLabel yellowLabel=new JLabel();
yellowLabel.setOpaque(true);
yellowLabel.setBackground(new Color(248,213,131));
yellowLabel.setPreferredSize(new Dimension(200,180));
//设置菜单栏并将标签添加到内容窗格
frame.setJMenuBar(greenMenuBar);
frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);
//显示窗口
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
createAndShowGUI();
}
}
顶级容器和包含层次结构
使用Swing组件的每个程序至少有一个顶级容器。此顶级容器是包含层次结构的根 - 包含显示在顶级容器内的所有Swing组件的层次结构。
通常,具有基于Swing的GUI的独立应用程序至少有一个JFrame
以其根为根的包含层次结构。例如,如果应用程序具有一个主窗口和两个对话框,则该应用程序具有三个包含层次结构,因此具有三个顶级容器。一个包含层次结构JFrame
以其根为根,而另外两个包含JDialog
对象作为其根。
基于Swing的applet至少有一个包含层次结构,其中一个包含一个JApplet
对象。例如,调出对话框的applet有两个包含层次结构。浏览器窗口中的组件位于以JApplet
对象为根的包含层次结构中。该对话框具有以JDialog
对象为根的包含层次结构。
将组件添加到内容窗格
这是前面的示例用于获取框架内容窗格并向其添加黄色标签的代码:
frame.getContentPane().add(yellowLabel,BorderLayout.CENTER);
如代码所示,您可以通过调用getContentPane
方法找到顶级容器的内容窗格。默认内容窗格是一个简单的中间容器,它继承自JComponent
,并使用a BorderLayout
作为其布局管理器。
请注意,默认布局管理器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);
添加菜单栏
理论上,所有顶级容器都可以容纳菜单栏。但实际上,菜单栏通常只出现在框架和小程序中。要将菜单栏添加到顶级容器,请创建一个JMenuBar
对象,使用菜单填充它,然后调用setJMenuBar
。在TopLevelDemo
添加菜单栏与此代码框架:
frame.setJMenuBar(greenMenuBar);
根窗格
每个顶级容器都依赖于一个称为根窗格的隐藏中间容器。根窗格管理内容窗格和菜单栏以及其他几个容器。您通常不需要了解根窗格来使用Swing组件。但是,如果您需要拦截鼠标点击或绘制多个组件,您应该熟悉根窗格。
以下是根窗格为框架(以及每个其他顶级容器)提供的组件列表:
我们已经告诉过您内容窗格和可选菜单栏。根窗格添加的另外两个组件是分层窗格和玻璃窗格。分层窗格包含菜单栏和内容窗格,并启用其他组件的Z顺序。玻璃窗格通常用于拦截顶层容器上发生的输入事件,也可用于绘制多个组件。
实例
实例1-将组件添加到内容窗格
/**
* 将一个ScrollPane面板设为内容窗格
*/
package 使用顶级容器;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class ContentPaneDemo {
private static void setContentPane() {
// 创建并设置窗口
JFrame frame = new JFrame("内容窗格");
frame.setSize(300, 400);
frame.setLocation(300, 300);
frame.setLayout(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个JTextArea
JTextArea textArea = new JTextArea(5, 20);
//设置文本内容可编辑
textArea.setEditable(true);
// 设置自动换行
textArea.setLineWrap(true);
// 创建一个ScrollPane面板
JScrollPane scrollPane = new JScrollPane(textArea);
// 设置面板背景色
scrollPane.setBackground(Color.gray);
// 使scrollPane组件成为内容窗格
frame.setContentPane(scrollPane);
// 显示窗口
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
setContentPane();
}
}