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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;

import javax.swing.Box;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

public class CommonComponent {
// 创建窗体
Frame frame = new Frame("测试");
// 定义一个按钮
Button button = new Button("确认");
// 定义复选框组,复选组中的选项只能选择一项
CheckboxGroup checkboxGroup = new CheckboxGroup();
// 定义一个单选框(处于cbg组),默认选中
Checkbox maleCheckbox = new Checkbox("男", checkboxGroup, true);
// 定义一个单选框(处于cbg组),默认不选中
Checkbox femaleCheckbox = new Checkbox("女", checkboxGroup, false);
// 定义一个复选框,初始处于没有选中状态
Checkbox marriedCheckbox = new Checkbox("是否已婚?", false);
// 定义一个下拉选择框
Choice colorChoice = new Choice();
// 定义一个列表选择框,允许多选
List colorList = new List(6, true);
// 定义一个5行、20列的多行文本域
TextArea textArea = new TextArea(5, 20);
// 定义一个50列的单行文本域
TextField textField = new TextField(50);

public void init() {
textField.setText("textField");
textField.setBackground(Color.PINK);
textArea.setText("textArea");
textArea.setBackground(Color.CYAN);

// 给 下拉选择框 添加选项
colorChoice.add("红色");
colorChoice.add("绿色");
colorChoice.add("蓝色");
colorChoice.setBackground(Color.YELLOW);

// 给 列表选择框 添加选项
colorList.add("红色");
colorList.add("绿色");
colorList.add("蓝色");
colorList.setBackground(Color.ORANGE);

// 创建一个装载了文本框、按钮的Panel
Panel southInFrame = new Panel();
southInFrame.setBackground(Color.BLUE);
southInFrame.add(textField);
southInFrame.add(button);

// 放在窗体的南部(最下方)
frame.add(southInFrame, BorderLayout.SOUTH);

// 创建一个装载了下拉选择框、三个Checkbox的Panel
Panel checkPanel = new Panel();
checkPanel.setBackground(Color.green);
checkPanel.add(colorChoice);
checkPanel.add(maleCheckbox);
checkPanel.add(femaleCheckbox);
checkPanel.add(marriedCheckbox);

// 创建一个垂直排列组件的Box,盛装多行文本域、Panel
Box leftInTop = Box.createVerticalBox();
LineBorder lineBorder = new LineBorder(Color.BLACK, 2);
TitledBorder titledBorder = new TitledBorder(lineBorder, "leftInTop");
leftInTop.setBorder(titledBorder);
leftInTop.add(textArea);
leftInTop.add(checkPanel);

// 创建一个水平排列组件的Box,盛装topLeft、colorList
Box top = Box.createHorizontalBox();
LineBorder border = new LineBorder(Color.RED, 2);
TitledBorder titledBorder2 = new TitledBorder(border,"top");
top.setBorder(titledBorder2);
top.add(leftInTop);
top.add(colorList);

// 将top Box容器添加到窗口的中间
frame.add(top);
frame.pack();
frame.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

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