AWT Java 教程:从入门到实践
目录
- 什么是 AWT?
- AWT 的核心概念
- 组件
- 容器
- 布局管理器
- 第一个 AWT 程序:Hello Window
- 常用 AWT 组件详解
Label(标签)Button(按钮)TextField(文本框) 和TextArea(文本区域)Checkbox(复选框)Choice(下拉选择框)List(列表)Canvas(画布)
- 布局管理器
FlowLayout(流式布局)BorderLayout(边界布局)GridLayout(网格布局)CardLayout(卡片布局)
- 事件处理机制
- 事件监听器
ActionListener示例WindowListener示例
- AWT 与 Swing 的关系
- 总结与资源
什么是 AWT?
AWT (Abstract Window Toolkit) 是 Java 最早用于创建图形用户界面 的工具包,它是一个抽象窗口工具包,意味着它提供了一套与平台无关的 API,但底层的图形组件(如按钮、窗口等)是由操作系统的本地代码实现的。

- 优点:
- 跨平台:Java 代码在不同操作系统上运行时,能呈现出与该系统原生组件外观相似的界面。
- 历史悠久:是 Java GUI 编程的基础,非常稳定。
- 缺点:
- 外观受限:组件的外观取决于本地操作系统,无法实现完全自定义的“跨平台”外观。
- 功能相对简单:相比后来的 Swing,组件数量和功能较少。
- 重量级组件:每个 AWT 组件在底层都对应一个操作系统级的窗口对象,消耗较多资源。
尽管 Swing 在很多方面已经取代了 AWT,但理解 AWT 对于学习 Java GUI 编程的原理仍然非常重要。
AWT 的核心概念
在开始写代码前,你需要了解 AWT 的三个基本概念:
a. 组件
组件是 GUI 的基本构建块,比如按钮、标签、文本框等,它们是 java.awt.Component 类的子类,组件不能单独存在,必须被放置在容器中。
b. 容器
容器是一种特殊的组件,它的主要作用是“盛放”其他组件。java.awt.Container 继承自 Component。

- 顶级容器:
Frame(窗口)、Dialog(对话框)、Window(窗口基类)。 - 中间容器:
Panel(面板)、ScrollPane(滚动面板)。
重要:一个容器可以嵌套另一个容器,形成复杂的布局。
c. 布局管理器
布局管理器负责决定容器中组件的位置和大小,如果你不使用布局管理器,就需要手动设置每个组件的坐标和尺寸,这在跨平台时非常麻烦,AWT 提供了多种内置的布局管理器来简化布局。
第一个 AWT 程序:Hello Window
让我们从一个最简单的例子开始:创建一个带标题的窗口。
// AWTHelloWorld.java
import java.awt.Frame; // 导入 Frame 类
public class AWTHelloWorld {
public static void main(String[] args) {
// 1. 创建一个顶级容器(窗口)
Frame frame = new Frame("我的第一个 AWT 窗口");
// 2. 设置窗口大小(宽度和高度,单位是像素)
frame.setSize(400, 300);
// 3. 设置窗口可见(默认是不可见的)
frame.setVisible(true);
// 注意:直接运行这个程序,点击窗口的关闭按钮,程序不会退出。
// 我们需要添加窗口监听器来处理关闭事件(见第6节)。
}
}
如何运行:

- 将代码保存为
AWTHelloWorld.java。 - 编译:
javac AWTHelloWorld.java - 运行:
java AWTHelloWorld
你会看到一个标题为“我的第一个 AWT 窗口”的窗口。
常用 AWT 组件详解
下面我们来向窗口中添加一些常用的组件。
a. Label (标签)
用于显示单行文本或图像。
Label label = new Label("这是一个标签");
frame.add(label); // 将标签添加到窗口中
b. Button (按钮)
用户可以点击的按钮。
Button button = new Button("点击我");
frame.add(button);
c. TextField (文本框) 和 TextArea (文本区域)
TextField:单行文本输入框。TextArea:多行文本区域,通常带有滚动条。
TextField textField = new TextField("请输入文本", 20); // 初始文本和列数
frame.add(textField);
TextArea textArea = new TextArea("这是一个文本区域\n支持多行", 5, 20); // 行数和列数
frame.add(textArea);
d. Checkbox (复选框)
提供“选中/未选中”两种状态的选项。
Checkbox cb1 = new Checkbox("选项 1");
Checkbox cb2 = new Checkbox("选项 2", true); // 第二个参数 true 表示默认选中
frame.add(cb1);
frame.add(cb2);
e. Choice (下拉选择框)
提供一个下拉列表供用户选择。
Choice choice = new Choice();
choice.add("选项 A");
choice.add("选项 B");
choice.add("选项 C");
frame.add(choice);
f. List (列表)
显示一个可滚动的项目列表,支持多选。
List list = new List(3, true); // 3行可见,true 表示允许多选
list.add("项目 1");
list.add("项目 2");
list.add("项目 3");
frame.add(list);
布局管理器
直接使用 add() 方法添加组件,它们会按照默认的布局(通常是 FlowLayout)排列,为了更好地控制布局,我们需要显式地设置布局管理器。
a. FlowLayout (流式布局)
组件从左到右、从上到下依次排列,像文字一样“流动”,当一行放满时,会自动换到下一行。
// 在创建窗口后,设置布局 frame.setLayout(new FlowLayout()); // 默认对齐方式是居中 // frame.setLayout(new FlowLayout(FlowLayout.LEFT)); // 左对齐 // frame.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 20)); // 右对齐,组件间距10,行间距20
示例:
import java.awt.*;
public class FlowLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("FlowLayout 示例");
frame.setSize(300, 200);
frame.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); // 居中,组件间距10,行间距10
frame.add(new Button("Button 1"));
frame.add(new Button("Button 2"));
frame.add(new Button("Button 3"));
frame.add(new Button("A Long Button Name"));
frame.setVisible(true);
}
}
b. BorderLayout (边界布局)
将容器划分为五个区域:NORTH (北), SOUTH (南), WEST (西), EAST (东), CENTER (中心),每个区域只能添加一个组件。CENTER 区域会自动填充剩余空间。
frame.setLayout(new BorderLayout());
frame.add(new Button("North"), BorderLayout.NORTH);
frame.add(new Button("South"), BorderLayout.SOUTH);
frame.add(new Button("West"), BorderLayout.WEST);
frame.add(new Button("East"), BorderLayout.EAST);
frame.add(new Button("Center"), BorderLayout.CENTER);
c. GridLayout (网格布局)
将容器划分为一个网格,每个网格大小相同,组件按添加顺序从左到右、从上到下填充网格。
// 3行4列的网格,组件水平和垂直间距为5
frame.setLayout(new GridLayout(3, 4, 5, 5));
for (int i = 1; i <= 12; i++) {
frame.add(new Button("Btn " + i));
}
d. CardLayout (卡片布局)
它像一个卡片堆叠器,同一时间只显示一个组件,通常用于实现选项卡或向导式的界面。
使用方法稍复杂,需要配合 next(), first(), show() 等方法来切换显示的卡片。
事件处理机制
GUI 程序是事件驱动的,用户的操作(如点击按钮、关闭窗口)会产生事件,程序需要“监听”这些事件并做出响应。
实现事件处理的核心是事件监听器。
步骤:
- 获取事件源:比如一个按钮
Button btn = ...。 - 创建监听器对象:通常是一个实现了特定监听器接口(如
ActionListener)的匿名内部类。 - 将监听器注册到事件源:使用
btn.addActionListener(...)。
a. ActionListener 示例:点击按钮改变标签文本
import java.awt.*;
import java.awt.event.*;
public class EventDemo {
public static void main(String[] args) {
Frame frame = new Frame("事件处理示例");
frame.setSize(300, 200);
frame.setLayout(new FlowLayout());
// 1. 创建组件
Label label = new Label("初始文本");
Button button = new Button("点击改变我");
// 2. 创建监听器并注册到按钮
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 当按钮被点击时,此方法会被调用
label.setText("文本已被改变!");
}
});
// 3. 将组件添加到窗口
frame.add(label);
frame.add(button);
// 4. 处理窗口关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0); // 点击关闭按钮时退出程序
}
});
frame.setVisible(true);
}
}
ActionListener用于处理按钮点击、文本框回车等动作事件。WindowListener用于处理窗口事件,如打开、关闭、激活等,我们通常使用它的子类WindowAdapter来避免实现所有 7 个方法,只需覆盖需要的方法即可。
AWT 与 Swing 的关系
Swing 是在 AWT 基础上发展起来的,是 Java 更现代、更强大的 GUI 工具包。
- 关系:Swing 大量使用了 AWT 的底层类(如
Event,Color,Font等),但提供了自己的轻量级组件。 - 核心区别:
- 外观:Swing 组件是轻量级的,它们不依赖于操作系统的本地代码,因此可以实现跨平台的统一外观。
- 组件:Swing 提供了更多、更丰富的组件,如
JTable(表格),JTree(树),JInternalFrame(内部窗口) 等。 - 命名:Swing 组件的类名通常以 "J" 开头,如
JFrame,JButton,JLabel。
现代建议: 对于新的 Java GUI 项目,强烈推荐使用 Swing,因为它提供了更好的外观和更强大的功能,学习 AWT 对于理解 Java GUI 的基本原理至关重要,Swing 的许多概念(如事件处理、布局管理)都源于 AWT。
总结与资源
- AWT 是 Java 的基础 GUI 工具包,提供了跨平台的窗口和组件。
- 核心元素是组件、容器和布局管理器。
- GUI 程序是事件驱动的,通过事件监听器来响应用户操作。
- 虽然 Swing 更现代,但 AWT 是理解 Java GUI 编程的基石。
学习资源:
- Oracle 官方文档:这是最权威的资料。
- AWT 教程 (Oracle) (注意:官方教程主要讲 Swing,但 AWT 组件在 Swing 的列表中也有体现)
- AWT API 文档 (Oracle)
- 书籍:《Java 核心技术 卷 I》等经典 Java 书籍都有详细的 GUI 章节。
- 在线教程:W3Schools, Runoob 等网站也有 Java AWT 的入门教程。
希望这份教程能帮助你顺利入门 AWT!动手实践是学习 GUI 编程最好的方式,尝试组合不同的组件和布局,创建你自己的应用程序吧。
