一、基本组件
AWT提供了如下基本组件:
- Button:按钮,可接受单击操作。
- Canvas:用于绘图的画布。
- Checkbox:复选框组件(也可变成单选框组件)。
- CheckboxGroup:用于将多个 Checkbox 组件合成一组,一组 Checkbox 组件将只有一个可以被选中,即全部变成单选框组件。
- Choice:下拉式选择框组件。
- Frame:窗口,在 GUI 程序里通过该类创建窗口。
- Label:标签类,用于放置提示性文本。
- List:列表框组件,可以添加多条项目。
- Panel:不能单独存在的基本容器类,必须放到其他容器中。
- Scrollbar:滑动条组件,如果需要用户输入位于某个范围的值,就可以使用滑动条组件,比如调色板中设置 RGB 的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值、滑块的大小、最小值和最大值。
- ScrollPane:带水平及垂直滚动条的容器组件。
- TextArea:多行文本域。
- TextField:单行文本框。
下面的例子程序示范了它们的基本用法。
public class ComponentTest {
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);
//定义一个复选框(处于cbg一组),初始处于未被选中状态
Checkbox married = new Checkbox("是否已婚" , false);
//定义一个下拉选择框
Choice color = 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() {
color.add("红色");
color.add("绿色");
color.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(color);
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 ComponentTest().init();
}
}
程序运行效果如下:
二、对话框(Dialog)
Dialog 是 Window 类的子类,是一个容器类,属于特殊组件,对话框是可以独立存在的顶级窗口,因此用法与普通窗口的用法几乎完全一样,但对话框有如下亮点需要注意。
- 对话框通常依赖于其他窗口,就是通常有一个 parent 窗口。
- 对话框有非模式(non-modal)和模式(modal)两种,当某个模式对话框被打开之后,该模式对话框总是位于它依赖的窗口之上;在模式对话框被关闭之前,它依赖的窗口无法获得焦点。
对话框有多个重载的构造器,他的构造器可能有如下三个参数:
- owner:指定该对话框所依赖的窗口,既可以是窗口,也可以是对话框。
- title:指定该对话窗的窗口标题。
- modal:指定该对话框是否是模式的,可以是 true 或 false。
下面的例子程序示范了模式对话框和非模式对话框的用法。
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() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
d2.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
d2.dispose();
}
});
d1.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
d1.dispose();
}
});
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();
}
}
上面程序创建了 d1 和 d2 两个对话框,其中 d1 是一个模式对话框,而 d2 是一个非模式对话框(两个对话框都是空的)。该窗口还提供了两个测试按钮,分别用于打开模式对话框和非模式对话框。打开模式对话框后鼠标无法激活原来的 “测试窗口”;但打开非模式对话框后还可以激活原来的 “测试窗口”。
Dialog 类还有一个子类:FIleDialog,它代表一个文件对话框,用于打开或保存文件。FIleDialog 也提供了几个构造器,可分别支持 parent、title 和 mode 三个构造参数,其中 parent、title 指定文件对话框的所属父窗口和标题;而 mode 指定该窗口用于打开文件或保存文件,该参数支持如下两个参数值:FileDialog.LOAD、FileDialog.SAVE。
FileDialog 提供了如下两个方法来获取被打开/保存文件的绝对路径。
- getDirectory():获取 FileDialog 被打开/保存文件的绝对路径。
- getFile:获取 FileDialog 被打开/保存文件的文件名。
下面程序分别示范了使用 FileDialog 来创建打开/保存文件的对话框。
public class FileDIalogTest {
Frame f = new Frame("测试");
FileDialog d1 = new FileDialog(f,"选择需要打开的文件",FileDialog.LOAD);
FileDialog d2 = new FileDialog(f,"选择保存文件的路径",FileDialog.SAVE);
Button b1 = new Button("打开文件");
Button b2 = new Button("保存文件");
public void init() {
b1.addActionListener(e -> {
d1.setVisible(true);
System.out.println(d1.getDirectory()+d1.getFile());
});
b2.addActionListener(e -> {
d2.setVisible(true);
System.out.println(d2.getDirectory() + d2.getFile());
});
f.add(b1);
f.add(b2,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new FileDIalogTest().init();
}
}
**end**