我们可以在 JFrame 对象中添加 AWT 或者 Swing 组件。但是,虽然它有 add 方法,却不能直接用于添加组件,否则会抛出异常。造成这个现象的原因:JFrame 不是一个容器,它只是一个框架。那么,应该怎么添加组件呢?
JFrame 有一个 Content Pane,窗口能显示的所有组件都是添加在这个 Content Pane 中。JFrame 提供了两个方法:getContentPane 和 setContentPane 就是用于获取和设置其 Content Pane 的。
对JFrame添加组件有两种方式:
1)用getContentPane()方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childComponent)2)建立一个Jpanel或JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板
JPanel contentPane=new JPanel();//把其它组件添加到Jpanel中;
frame.setContentPane(contentPane);//把contentPane对象设置成为frame的内容面板
10.2.1 容器
AWT容器分为两类:外部容器和内部容器。其中,外部容器一般会独立存在,例如Frame类;而内部容器则会嵌套在外部容器内部使用,例如Panel类。容器的层次结构如图10-2所示。
图10-2 AWT容器的层次结构
其中两个最常用的容器是Frame和Panel。在后面我们还要单独介绍Applet(一种特殊的Panel)。
框架(Frame):Frame是顶级窗口,可以显示标题,重置大小。
面板(Panel):面板提供了建立应用程序的空间。我们可以把图形元件(包括其他面板)放在一个面板上,然后把这个面板作为内部容器放在Frame等外部容器上。
容器类的常用方法包括:
add()
add(Component com)
add(Component, int index)
add(Component component, Object constraints)
add(String name, Component component),
add(Component component, Object constraints, int index)
setLayout() and getLayout()
getComponent()
getInsets()
remove and removeAll()
validate()
这些方法主要与我们后面讲的步骤,例如布局管理、添加组件有关。
10.2.2 布局管理
选择了容器之后,可以通过容器的setLayout()和getLayout()方法来确定布局(Layout),也就是限制容器中各个组件的位置和大小等。
Java提供了多种布局,如顺序布局(Flow Layout)、边界布局(Border Layout)和网格布局(Grid Layout)等。
1.顺序布局
顺序布局(Flow Layout)是最基本的一种布局,面板的默认布局就是顺序布局。顺序布局指的是把图形元件一个接一个地放在面板上。下面是一个顺序布局的例子。
package sample;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyFlowLayout {
private Frame f;
private Button button1, button2, button3;
public static void main (String args[]) {
MyFlowLayout mflow = new MyFlowLayout ();
mflow.go();
}
public void go() {
f = new Frame ("FlowLayout演示");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt) {
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
//f.setLayout(new FlowLayout());
f.setLayout(new FlowLayout(FlowLayout.LEADING, 20, 20));
button1 = new Button("确定");
button2 = new Button("打开");
button3 = new Button("关闭");
f.add(button1);
f.add(button2);
f.add(button3);
f.setSize (200,200);
f.pack();
f.setVisible(true);
}
}
程序运行结果见图10-3。
图10-3 顺序布局(Flow Layout)
2.边界布局
边界布局(Border Layout)包括5个区:北区、南区、东区、西区和中区。这5个区在面板上的分布规律是“上北下南,左西右东”。下面是一个边界布局的例子。
package sample;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyBorderLayout {
Frame f;
Button east, south, west, north, center;
public static void main(String args[]) {
MyBorderLayout mb = new MyBorderLayout();
mb.go();
}
public void go() {
f = new Frame("BorderLayout 演示");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt) {
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
f.setBounds(0,0, 300, 300);
f.setLayout(new BorderLayout());
north = new Button("北");
south = new Button("南");
east = new Button("东");