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(); Checkbox maleCheckbox = new Checkbox("男", checkboxGroup, true); Checkbox femaleCheckbox = new Checkbox("女", checkboxGroup, false); Checkbox marriedCheckbox = new Checkbox("是否已婚?", false); Choice colorChoice = new Choice(); List colorList = new List(6, true); TextArea textArea = new TextArea(5, 20); 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 southInFrame = new Panel(); southInFrame.setBackground(Color.BLUE); southInFrame.add(textField); southInFrame.add(button);
frame.add(southInFrame, BorderLayout.SOUTH);
Panel checkPanel = new Panel(); checkPanel.setBackground(Color.green); checkPanel.add(colorChoice); checkPanel.add(maleCheckbox); checkPanel.add(femaleCheckbox); checkPanel.add(marriedCheckbox);
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 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);
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)
Dialog
是Window
类的子类,是一个容器类,属于特殊组件。对话框是可以独立存在的顶级窗口,因此用法与普通窗口的用法几乎完全一样。但对话框有如下两点需要注意。
- 对话框通常依赖于其他窗口,就是通常有一个
parent
窗口。
- 对话框有非模式(
non-Modal
)和模式(modal
)两种,当某个模式对话框被打开之后,该模式对话框总是位于它依赖的窗口之上;在模式对话框被关闭之前,它依赖的窗口无法获得焦点。
owner
:指定该对话框所依赖的窗口,既可以是窗口,也可以是对话框。
title
:指定该对话框的窗口标题
modal
:指定该对话框是否是模式的,可以是true
或false
程序示例 模式对话框 非模式对话框
下面的例子程序示范了模式对话框和非模式对话框的用法
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(); } }
|
运行效果如下图所示:
上面程序创建了d1
和d2
两个对话框,其中d1
是一个模式对话框,而d2
是一个非模式对话框(两个对话框都是空的)。该窗口中还提供了两个按钮,分别用于打开模式对话框和非模式对话框。
- 打开模式对话框后鼠标无法激活原来的“测试窗口”;
- 但打开非模式对话框后还可以激活原来的“测试窗口”。
在上面的程序中,不管是模式对话框还是非模式对话框,打开后都无法关闭它们,因为程序没有为这两个对话框编写事件监听器。
应该使用模式对话框的情况
如果主程序需要对话框里接收的输入值,则应该把该对话框设置成模式对话框,因为模式对话框会阻塞该程序;如果把对话框设置成非模式对话框,则可能造成对话框被打开了,但用户并没有操作该对话框,也没有向对话框里进行输入,这就会引起主程序的异常。
文件对话框
Dialog
类还有一个子类:FileDialog
,它代表一个文件对话框,用于打开或者保存文件。FileDialog
也提供了几个构造器,可分别支持parent
、title
和mode
三个构造参数,其中parent
、title
指定文件对话框的所属父窗口和标题;而mode
指定该窗口用于打开文件或保存文件,该参数支持如下两个参数值:FileDialog.LOAD
、FileDialog.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
程序所在的运行平台)提供的文件对话框,所以当单击其中的图标、按钮等元素时,该对话框都能提供相应的动作。当选中某个文件后,单击“打开”按钮,将看到程序控制台打印出该文件的绝对路径(文件路径+文件名),这就是由FileDialog
的getDirectory
和getFile
方法提供的。