11.2 AWT容器

11.2 AWT容器

容器(Container)是Component的子类,因此容器对象本身也是一个组件,具有组件的所有性质,可以调用Component类的所有方法。

Component类

设置组件大小位置可见性的方法

Component类提供了如下几个常用方法来设置组件的大小、位置和可见性等。

方法 描述
void setLocation(int x, int y) 设置组件的位置
void setLocation(Point p) Moves this component to a new location.
void setSize(int width, int height) 设置组件的大小
void setSize(Dimension d) Resizes this component so that it has width d.width and height d.height
void setBounds(int x, int y, int width, int height) 同时设置组件的位置、大小
void setBounds(Rectangle r) Moves and resizes this component to conform to the new bounding rectangle r
void setVisible(boolean b) 设置该组件的可见性

Container类

访问容器内的组件的方法

容器还可以盛装其他组件,容器类(Container)提供了如下几个常用方法来访问容器里的组件:

方法 描述
Component add(Component comp) Appends the specified component to the end of this container.
Component add(Component comp, int index) Adds the specified component to this container at the given position.
Component getComponent(int n) Gets the nth component in this container.
int getComponentCount() Gets the number of components in this panel.
Component[] getComponents() Gets all the components in this container.

AWT容器分类

AWT主要提供了如下两种主要的容器类型。

  1. Window:可独立存在的顶级窗口。
  2. Panel:可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中(如WindowPanel或者Applet等)。

AWT容器继承关系

AWT容器的继承关系图,如图11.3所示。

图11.3

图11.3中显示了AWT容器之间的继承层次,其中FrameDialogAWT编程中常用的组件。

Frame

Frame代表常见的窗口,它是Window类的子类,具有如下几个特点

  • Frame对象有标题,允许通过拖拉来改变窗口的位置、大小
  • 初始化时为不可见,可用setVisible(true)使其显示出来
  • 默认使用BorderLayout作为其布局管理器。

程序示例 创建一个窗口

下面的例子程序通过Frame创建了一个窗口。

1
2
3
4
5
6
7
8
9
10
11
import java.awt.*;

public class FrameTest {
public static void main(String[] args) {
Frame f = new Frame("测试窗口");
// 设置窗口的大小、位置
f.setBounds(30, 30, 250, 200);
// 将窗口显示出来(Frame对象默认处于隐藏状态)
f.setVisible(true);
}
}

运行上面程序,会看到一个简单的窗口。点击窗口右上角的“×”按钮,该窗口不会关闭,这是因为还未为该窗口编写任何事件响应。如果想关闭该窗口,可以通过关闭运行该程序的命令行窗口来关闭该窗口。

Panel

PanelAWT中另一个典型的容器,Panel代表不能独立存在、必须放在其他容器中的容器Panel外在表现为一个矩形区域,该区域内可盛装其他组件。Panel容器存在的意义在于为其他组件提供空间,Panel容器具有如下几个特点

  • 可作为容器来盛装其他组件,为放置组件提供空间。
  • 不能单独存在,必须放置到其他容器中。
  • 默认使用FlowLayout作为其布局管理器。

程序示例 创建Panel

下面的例子程序使用Panel作为容器来盛装一个文本框和一个按钮,并将该Panel对象添加到Frame对象中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.awt.*;

public class PanelTest {
public static void main(String[] args) {
Frame f = new Frame("测试窗口");
// 创建一个Panel容器
Panel p = new Panel();
// 向Panel容器中添加两个组件
p.add(new TextField(20));
p.add(new Button("单击我"));
// 将Panel容器添加到Frame窗口中
f.add(p);
// 设置窗口的大小、位置
f.setBounds(30, 30, 250, 120);
// 将窗口显示出来(Frame对象默认处于隐藏状态)
f.setVisible(true);
}
}

编译、运行上面程序,会看到如图11.5所示的运行窗口:

图11.5

从图11.5中可以看出,使用AWT创建窗口很简单,程序只需要通过Frame创建,然后再创建一些AWT组件,把这些组件添加到Frame创建的窗口中即可。

ScrollPane

ScrollPane是一个带滚动条的容器,它也不能独立存在,必须被添加到其他容器中。ScrollPane容器具有如下几个特点。

  • 可作为容器来盛装其他组件,当组件占用空间过大时,ScrollPane自动产生滚动条。当然也可以通过指定特定的构造器参数来指定默认具有滚动条。
  • 不能单独存在,必须放置到其他容器中。
  • 默认使用BorderLayout作为其布局管理器。ScrollPane通常用于盛装其他容器,所以通常不允许改变ScrollPane的布局管理器

程序示例 创建ScrollPane

下面的例子程序使用ScrollPane容器来代替Panel容器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.awt.*;

public class ScrollPaneTest {
public static void main(String[] args) {
Frame f = new Frame("测试窗口");
// 创建一个ScrollPane容器,指定总是具有滚动条
ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
// 向ScrollPane容器中添加两个组件
sp.add(new TextField(20));
sp.add(new Button("单击我"));
// 将ScrollPane容器添加到Frame对象中
f.add(sp);
// 设置窗口的大小、位置
f.setBounds(30, 30, 250, 120);
// 将窗口显示出来(Frame对象默认处于隐藏状态)
f.setVisible(true);
}
}

运行上面程序,会看到如图11.6所示的窗口:

图11.6

图11.6所示的窗口中具有水平、垂直滚动条,这符合使用ScrollPane后的效果。程序明明向ScrollPane容器中添加了一个文本框和一个按钮,但只能看到一个按钮,却看不到文本框,这是为什么呢?这是因为ScrollPane使用BorderLayout布局管理器的缘故,而Borderlayout导致了该容器中只有一个组件被显示出来。下一节将向读者详细介绍布局管理器的知识。