11.4 AWT常用组件

11.4 AWT常用组件

AWT组件需要调用运行平台的图形界面来创建和平台一致的对等体,因此AWT只能使用所有平台都支持的公共组件,所以AWT只提供了一些常用的GUI组件。

11.4.1 基本组件

AWT提供了如下基本组件:

AWT组件 描述
Button 按钮,可接受单击操作。
Canvas 用于绘图的画布。
Checkbox 复选框组件(也可变成单选框组件)。
CheckboxGroup 用于将多个Checkbox组件组合成一组,一组Checkbox组件将只有一个可以被选中,即全部变成单选框组件。
Choice 下拉式选择框组件。
Frame 窗口,在GUI程序里通过该类创建窗口。
Label 标签类,用于放置提示性文本。
List 列表框组件,可以添加多项条目。
Panel 不能单独存在基本容器类,必须放到其他容器中。
Scrollbar 滑动条组件。如果需要用户输入位于某个范围的值,就可以使用滑动条组件,比如调色板中设置RGB的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值滑块的大小、最小值和最大值。
TextArea 多行文本域。
TextField 单行文本框。

这些AWT组件的用法比较简单,读者可以査阅API文档来获取它们各自的构造器、方法等详细信息。

程序示例

下面的例子程序示范了它们的基本用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.awt.*;
import javax.swing.*;

public class CommonComponent {
Frame f = new Frame("测试");
// 定义一个按钮
Button ok = new Button("确认");
CheckboxGroup cbg = new CheckboxGroup();
// 定义一个单选框(处于cbg组),初始处于被选中状态
Checkbox male = new Checkbox("男", cbg, true);
// 定义一个单选框(处于cbg组),初始处于没有选中状态
Checkbox female = new Checkbox("女", cbg, false);
// 定义一个复选框,初始处于没有选中状态
Checkbox married = new Checkbox("是否已婚?", false);
// 定义一个下拉选择框
Choice colorChooser = new Choice();
// 定义一个列表选择框
List colorList = new List(6, true);
// 定义一个5行、20列的多行文本域
TextArea ta = new TextArea(5, 20);
// 定义一个50列的单行文本域
TextField name = new TextField(50);

public void init() {
colorChooser.add("红色");
colorChooser.add("绿色");
colorChooser.add("蓝色");

colorList.add("红色");
colorList.add("绿色");
colorList.add("蓝色");
// 创建一个装载了文本框、按钮的Panel
Panel bottom = new Panel();
bottom.add(name);
bottom.add(ok);
f.add(bottom, BorderLayout.SOUTH);
// 创建一个装载了下拉选择框、三个Checkbox的Panel
Panel checkPanel = new Panel();
checkPanel.add(colorChooser);
checkPanel.add(male);
checkPanel.add(female);
checkPanel.add(married);
// 创建一个垂直排列组件的Box,盛装多行文本域、Panel
Box topLeft = Box.createVerticalBox();
topLeft.add(ta);
topLeft.add(checkPanel);
// 创建一个水平排列组件的Box,盛装topLeft、colorList
Box top = Box.createHorizontalBox();
top.add(topLeft);
top.add(colorList);
// 将top Box容器添加到窗口的中间
f.add(top);
f.pack();
f.setVisible(true);
}

public static void main(String[] args) {
new CommonComponent().init();
}
}

关于AWT常用组件的用法,以及布局管理器的用法,读者可以参考API文档来逐渐熟悉它们。旦掌握了它们的用法之后,就可以借助于IDE工具来设计GUI界面,使用IDE工具可以更快地设计出更美观的GUI界面。

11.4.2 对话框(Dialog)

DialogWindow类的子类,是一个容器类,属于特殊组件。对话框是可以独立存在的顶级窗口,因此用法与普通窗口的用法几乎完全一样。但对话框有如下两点需要注意。

  • 对话框通常依赖于其他窗口,就是通常有一个parent窗口。
  • 对话框有非模式(non-Modal)和模式(modal)两种,当某个模式对话框被打开之后,该模式对话框总是位于它依赖的窗口之上;在模式对话框被关闭之前,它依赖的窗口无法获得焦点.
  • owner:指定该对话框所依赖的窗口,既可以是窗口,也可以是对话框。
  • title:指定该对话框的窗口标题
  • modal:指定该对话框是否是模式的,可以是truefalse

程序示例 模式对话框 非模式对话框

下面的例子程序示范了模式对话框和非模式对话框的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.Frame;

public class DialogTest
{
Frame f = new Frame("测试");
Dialog d1 = new Dialog(f, "模式对话框" , true);
Dialog d2 = new Dialog(f, "非模式对话框" , false);
Button b1 = new Button("打开模式对话框");
Button b2 = new Button("打开非模式对话框");
public void init()
{
d1.setBounds(20 , 30 , 300, 400);
d2.setBounds(20 , 30 , 300, 400);
b1.addActionListener(e -> d1.setVisible(true));
b2.addActionListener(e -> d2.setVisible(true));
f.add(b1);
f.add(b2 , BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new DialogTest().init();
}
}

上面程序创建了d1d2两个对话框,其中d1是一个模式对话框,而d2是一个非模式对话框(两个对话框都是空的)。该窗口中还提供了两个按钮,分别用于打开模式对话框和非模式对话框。

  • 打开模式对话框后鼠标无法激活原来的“测试窗口”;
  • 但打开非模式对话框后还可以激活原来的“测试窗口”。

在上面的程序中,不管是模式对话框还是非模式对话框,打开后都无法关闭它们,因为程序没有为这两个对话框编写事件监听器。

应该使用模式对话框的情况

如果主程序需要对话框里接收的输入值,则应该把该对话框设置成模式对话框,因为模式对话框会阻塞该程序;如果把对话框设置成非模式对话框,则可能造成对话框被打开了,但用户并没有操作该对话框,也没有向对话框里进行输入,这就会引起主程序的异常。

文件对话框

Dialog类还有一个子类:FileDialog,它代表一个文件对话框,用于打开或者保存文件。FileDialog也提供了几个构造器,可分别支持parenttitlemode三个构造参数,其中parenttitle指定文件对话框的所属父窗口和标题;而mode指定该窗口用于打开文件或保存文件,该参数支持如下两个参数值:FileDialog.LOADFileDialog.SAVE

FileDialog不能指定是模式对话框或非模式对话框,因为FileDialog依赖于运行平台的实现,如果运行平台的文件对话框是模式的,那么FileDialog也是模式的;否则就是非模式的

打开路径

FileDialog提供了如下两个方法来获取被打开保存文件的路径

方法 描述
String getDirectory() 获取FileDialog被打开/保存文件的绝对路径。
String getFile() 获取FileDialog被打开/保存文件的文件名。

程序示例 java调用平台的文件对话框

下面程序分别示范了使用FileDialog来创建打开保存文件的对话框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FileDialog;
import java.awt.Frame;

public class FileDialogTest {
Frame f = new Frame("测试");
// 创建两个文件对话框
FileDialog load = new FileDialog(f, "选择需要打开文件", FileDialog.LOAD);
FileDialog save = new FileDialog(f, "选择保存文件的路径", FileDialog.SAVE);
Button b1 = new Button("打开文件");
Button b2 = new Button("保存文件");

public void init() {
b1.addActionListener(e -> {
load.setVisible(true);
// 打印出用户选择的文件路径和文件名
System.out.println("正在打开文件:" + load.getDirectory() + load.getFile());
});
b2.addActionListener(e -> {
save.setVisible(true);
// 打印出用户选择的文件路径和文件名
System.out.println("正在保存文件:" + save.getDirectory() + save.getFile());
});
f.add(b1);
f.add(b2, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}

public static void main(String[] args) {
new FileDialogTest().init();
}
}

运行上面程序,单击主窗口中的“打开文件”按钮,将看到如图11.19所示的文件对话框窗口
这里有一张图片
从图11.19可以看出,这个文件对话框本身就是Windows(即Java程序所在的运行平台)提供的文件对话框,所以当单击其中的图标、按钮等元素时,该对话框都能提供相应的动作。当选中某个文件后,单击“打开”按钮,将看到程序控制台打印出该文件的绝对路径(文件路径+文件名),这就是由FileDialoggetDirectorygetFile方法提供的。