Java AWT 教程

26 Apr 2025 | 12 分钟阅读

Java AWT (Abstract Window Toolkit) 是一个用于在 Java 中开发图形用户界面 (GUI) 或基于窗口的应用程序的 API。

Java AWT 组件是平台相关的,即组件的显示方式取决于操作系统的外观。AWT 是重量级的,即其组件使用底层操作系统 (OS) 的资源。

java.awt 提供了 AWT API 的 ,例如 TextFieldLabelTextArea、RadioButton、CheckBoxChoiceList 等。

AWT 教程将帮助用户以简单易懂的步骤理解 Java GUI 编程。

为什么 AWT 是平台无关的?

Java AWT 调用本地平台(操作系统)的子程序来创建 API 组件,如 TextField、ChechBox、button 等。

例如,一个带有 TextField、label 和 button 组件的 AWT GUI 在 Windows、MAC OS 和 Unix 等不同平台上看起来会有所不同。这是因为不同的平台对其本地组件有不同的外观,而 AWT 直接调用创建这些组件的本地子程序。

简单来说,AWT 应用程序在 Windows OS 上看起来像一个 Windows 应用程序,而在 MAC OS 上看起来像一个 Mac 应用程序。

Java AWT 层次结构

Java AWT 类的层次结构如下所示。

Java AWT Tutorial

组成部分

所有元素,如按钮、文本字段、滚动条等,都称为组件。在 Java AWT 中,每个组件都有相应的类,如上图所示。为了将每个组件放置在屏幕上的特定位置,我们需要将它们添加到容器中。

容器

Container 是 AWT 中的一个组件,它可以包含其他组件,如 按钮、文本字段、标签等。继承 Container 类的类被称为容器,例如 Frame、DialogPanel。

它本质上是一个放置组件的屏幕,组件被放置在特定位置。因此,它包含并控制组件的布局。

注意:容器本身就是一个组件(参见上图),因此我们可以将一个容器添加到另一个容器中。

容器类型

Java AWT 中有四种类型的容器。

  1. Window
  2. Panel
  3. Frame
  4. Dialog (对话框)

Window

Window 是一个没有边框和菜单栏的容器。您必须使用 Frame、Dialog 或另一个 Window 来创建 Window。我们需要创建一个 Window 类的实例来创建此容器。

Panel

Panel 是一个没有标题栏、边框或菜单栏的容器。它是一个通用的容器,用于容纳组件。它可以包含其他组件,如按钮、文本字段等。Panel 类的实例创建一个容器,我们可以在其中添加组件。

Frame

Frame 是一个包含标题栏和边框的容器,并且可以有菜单栏。它可以包含其他组件,如按钮、文本字段、滚动条等。Frame 是开发 AWT 应用程序时最常用的容器。

Component 类的有用方法

方法描述
public void add(Component c)将一个组件添加到此组件中。
public void setSize(int width,int height)设置组件的大小(宽度和高度)。
public void setLayout(LayoutManager m)为组件定义布局管理器。
public void setVisible(boolean status)更改组件的可见性,默认值为 false。

Java AWT 示例

要创建简单的 AWT 示例,您需要一个 Frame。在 AWT 中,有两种方法可以使用 Frame 创建 GUI。

  1. 通过继承 Frame 类(继承
  2. 通过创建 Frame 类的对象(关联

通过继承实现的 AWT 示例

让我们看一个 AWT 的简单示例,其中我们继承了 Frame 类。在这里,我们在 Frame 上显示 Button 组件。

AWTExample1.java

上述示例中使用了 setBounds(int x-axis, int y-axis, int width, int height) 方法,该方法设置了 awt 按钮的位置。

输出

Java AWT Tutorial

通过关联实现的 AWT 示例

让我们看一个 AWT 的简单示例,其中我们创建了 Frame 类的实例。在这里,我们在 Frame 上创建了一个 TextField、Label 和 Button 组件。

AWTExample2.java

输出

Java AWT Tutorial

Java 的抽象窗口工具包 (AWT) 提供了一组用于创建图形用户界面和绘制图形的类。

Java AWT 类

Java AWT 标签 (Label)

Label 是 Java AWT 中一个不可交互的文本显示元素。它用于在 GUI 中显示单行只读文本。标签通常用于标识其他 GUI 组件或向用户提供说明。它们可以使用 Label.LEFT、Label.CENTER 和 Label.RIGHT 等常量进行对齐。

Java AWT 按钮 (Button)

Button 是一个 GUI 组件,在单击时会触发一个动作事件。它用于执行特定操作,例如提交表单或启动进程。按钮可以显示文本或图像,并且支持添加事件监听器来处理用户交互。

Java AWT 文本字段 (TextField)

TextField 是 Java AWT 中的单行文本输入组件。它允许用户输入和编辑文本。TextField 支持设置初始文本、获取文本输入以及为 Enter 键按下等操作添加事件监听器。

Java AWT 复选框 (Checkbox)

Checkbox 是一个可以被选中或取消选中的 GUI 组件。它用于用户可以独立选择或取消选择某个项目的选项。Checkbox 可以使用 CheckboxGroup 进行分组,以便一次只能从组中选择一项。

Java AWT 复选框组 (CheckboxGroup)

CheckboxGroup 用于对一组 Checkbox 进行分组,以便一次只能选中一个 Checkbox。这对于呈现一组互斥选项非常有用,类似于单选按钮。一组中的任何一个 Checkbox 在任何给定时间只能被选中。

Java AWT 选择框 (Choice)

Choice 是一个下拉列表,允许用户从预定义的选项列表中选择一个项目。它有助于在 GUI 中紧凑地呈现多个选择。Choice 组件易于集成和管理,提供了一种从列表中选择的简单方法。

Java AWT 列表 (List)

List 组件显示一个项目列表,允许用户从列表中选择一个或多个项目。它可以配置为支持单个或多个选择。List 有助于在可滚动区域中显示多个可选项。

Java AWT 画布 (Canvas)

Canvas 是一个空白的矩形区域,可以在其中绘制自定义图形。它是 Component 的子类,并提供了一个用于绘制形状、图像或处理自定义渲染的表面。开发人员通过覆盖 paint 方法来定义自定义绘制逻辑。

AWT 滚动条

滚动条(Scrollbar)是一个组件,它通过在轨道上滑动一个旋钮来使用户能够从一个范围内选择一个值。它可以水平或垂直定向,并有助于浏览大型内容区域或动态调整值。

Java AWT 菜单项 (MenuItem) 和菜单 (Menu)

MenuItem 和 Menu 用于在 GUI 中创建分层下拉菜单。MenuItem 代表单个菜单选项,而 Menu 将相关项分组在一起。它们被添加到 MenuBar 中,以在应用程序中提供结构化的导航和操作。

Java AWT 弹出菜单 (PopupMenu)

PopupMenu 是一个上下文菜单,在用户交互(通常是右键单击)时出现。它提供了一个操作列表,这些操作与交互的上下文相关。PopupMenu 有助于提供上下文相关的选项,而不会使主界面显得混乱。

Java AWT 面板 (Panel)

Panel 是一个容器,用于将其他组件分组在一起。它用于组织和管理多个 GUI 元素的布局。Panel 可以包含其他 Panel,从而实现复杂的嵌套布局和更好的界面组件组织。

Java AWT 工具包 (Toolkit)

Toolkit 类是一个抽象的超类,它提供了一个平台无关的接口来与 AWT 的各种资源和功能进行交互。它包括获取屏幕分辨率、图像处理和其他支持 GUI 操作的系统级服务的类。

Java AWT 中的事件处理

事件处理是构建交互式 Java 应用程序的基本方面,尤其是在使用抽象窗口工具包 (AWT) 创建图形用户界面 (GUI) 时。在 Java AWT 中,事件由用户交互生成,例如鼠标单击、按键和窗口操作。为了响应这些事件,Java 提供了一个强大的事件处理机制,其中包括各种监听器接口和事件类。

监听器是“监听”特定类型事件并处理它们的对象的集合。Java AWT 中的每个监听器接口都定义了一个或多个与特定事件对应的方法。通过实现这些接口并重写它们的方法,开发人员可以为不同的用户操作定义自定义行为。以下是 Java AWT 中一些关键的事件处理组件:

Java ActionListener

ActionListener 用于处理动作事件,例如按钮单击。当发生动作时,将调用 actionPerformed(ActionEvent e) 方法。

Java MouseListener

MouseListener 处理鼠标事件,包括单击、按下、释放、进入和退出。它提供了 mouseClicked(MouseEvent e)、mousePressed(MouseEvent e)、mouseReleased(MouseEvent e)、mouseEntered(MouseEvent e) 和 mouseExited(MouseEvent e) 等方法。

Java MouseMotionListener

MouseMotionListener 处理鼠标移动事件,例如鼠标移动和拖动。它包括 mouseMoved(MouseEvent e) 和 mouseDragged(MouseEvent e) 方法。

Java ItemListener

ItemListener 处理 Checkbox 和 Choice 列表等组件的项事件。它包含 itemStateChanged(ItemEvent e) 方法,当项的状态发生更改时调用该方法。

Java KeyListener

KeyListener 处理键盘事件。它提供了 keyTyped(KeyEvent e)、keyPressed(KeyEvent e) 和 keyReleased(KeyEvent e) 方法来响应键盘输入。

Java WindowListener

WindowListener 处理窗口事件,例如打开、关闭、激活、停用等。它包括 windowOpened(WindowEvent e)、windowClosing(WindowEvent e)、windowClosed(WindowEvent e)、windowIconified(WindowEvent e)、windowDeiconified(WindowEvent e)、windowActivated(WindowEvent e) 和 windowDeactivated(WindowEvent e) 等方法。

关闭 AWT 窗口

要处理 AWT 窗口的关闭,您通常需要实现 WindowListener 接口中的 windowClosing(WindowEvent e) 方法,在该方法中您可以调用 System.exit(0) 来终止应用程序。

Java AWT 的优点

  1. 平台独立性:AWT 提供了一种平台无关的方式来创建 GUI。相同的代码可以在不同的操作系统上运行而无需修改。
  2. 与原生系统的集成:AWT 组件是重量级的,这意味着它们使用宿主操作系统的原生 GUI 组件。这允许更好地与系统的外观和感觉集成。
  3. 易于使用:AWT 提供了一个直接且相对简单的 API 来创建基本的 GUI 应用程序。对于 Java GUI 开发的初学者来说,它是一个很好的起点。
  4. 事件处理:AWT 包含一个强大的事件处理模型,允许开发人员捕获和响应各种用户交互,如鼠标单击、按键和窗口事件。
  5. 基本布局管理器:AWT 提供基本的布局管理器,如 FlowLayout、BorderLayout 和 GridLayout,它们有助于在容器中排列组件,而无需显式定位。
  6. 轻量级组件:随着 Swing(扩展了 AWT)的引入,开发人员可以使用不依赖于原生同类组件的轻量级组件,从而提供更多的灵活性和自定义能力。
  7. 健壮性:作为 Java 标准库的一部分,AWT 经过了充分的测试和健壮,可确保应用程序的稳定性和可靠性。
  8. 向后兼容性:AWT 自 Java 1.0 以来就存在,因此与旧的 Java 应用程序兼容,并确保可以维护和运行旧应用程序。
  9. 丰富的组件集:AWT 提供了广泛的组件,如按钮、标签、文本字段、复选框、列表、菜单和对话框,能够创建多样化的用户界面。
  10. 自定义绘图功能:AWT 包含 Canvas 组件,它允许自定义绘图和渲染,从而灵活地创建复杂的图形和自定义 GUI 元素。

Java AWT 的缺点

  1. 有限的自定义:AWT 组件是重量级的,这意味着它们依赖于宿主操作系统的原生 GUI 组件。与 Swing 提供的轻量级组件相比,这可能会限制自定义和灵活性的程度。
  2. 平台依赖性问题:尽管 AWT 致力于平台独立性,但对原生组件的依赖可能导致在不同平台上的行为和外观不一致。
  3. 基本外观和感觉:AWT 组件很基础,缺乏 Swing 或 JavaFX 等更现代的 GUI 工具包中提供的高级外观和感觉。它们通常看起来过时且视觉吸引力较差。
  4. 组件有限:与 Swing 和 JavaFX 相比,AWT 提供的 GUI 组件数量相对较少。这可能使得创建复杂且功能丰富的用户界面变得困难。
  5. 线程问题:AWT 本身不是线程安全的,开发人员必须小心在事件分派线程 (EDT) 上执行 GUI 更新,以避免并发问题。
  6. 性能开销:使用重量级组件可能会带来性能开销,尤其是在渲染复杂界面或处理大量用户交互时。
  7. 缺乏高级功能:AWT 缺乏 Swing 和 JavaFX 中的许多高级功能,例如更好的事件处理、数据绑定和更复杂的布局管理。
  8. 过时:随着 Swing 和 JavaFX 的出现,AWT 对于现代应用程序开发已经过时。Swing 和 JavaFX 提供了更多的功能、更好的性能和更现代的 UI 功能。
  9. 有限的布局管理器:AWT 提供的布局管理器(FlowLayout、BorderLayout、GridLayout)相对简单,并且在设计复杂界面时可能受到限制。

Java AWT 选择题

1. 关于 Frame 和 Dialog 在 Java AWT 中的区别,以下哪个说法是正确的?

  1. Frame 和 Dialog 都可以用作顶层容器。
  2. Dialog 可以独立存在,无需父窗口,而 Frame 总是需要父窗口。
  3. Frame 支持模态和非模态行为,而 Dialog 总是模态的。
  4. Frame 不能包含任何组件,而 Dialog 可以包含其他组件。
 

答案:C

解释:在 Java AWT 中,Frame 是一个具有标题栏、边框和菜单栏的顶层容器,可以承载按钮和文本字段等组件。它可以是模态的(阻止对其他窗口的输入)和非模态的(同时允许对其他窗口的输入)。另一方面,Dialog 是一个模态的顶层容器,在关闭之前总是阻止对其他窗口的输入。


2. 在 Java AWT 中,以下哪个布局管理器最适合创建组件网格?

  1. FlowLayout
  2. GridLayout
  3. BorderLayout
  4. CardLayout
 

答案:B

解释:Java AWT 中的 GridLayout 以行和列的网格形式排列组件。它确保所有组件大小相等,并以网格状方式填充容器。此布局管理器非常适合创建表单或需要均匀间隔组件的网格。


3. Java AWT 组件的 repaint() 方法的主要目的是什么?

  1. 从屏幕上擦除组件。
  2. 更新组件的大小。
  3. 请求组件重新绘制自身。
  4. 删除容器中的所有子组件。
 

答案:C

解释:在 Java AWT 中,repaint() 方法用于请求重新绘制组件。它不会立即重绘组件,而是通过调用其 update() 和 paint() 方法来安排重绘。这对于响应用户输入或数据更改来更新组件的外观至关重要。


4. 在 Java AWT 中,以下哪个容器通常用于分组组件并根据特定布局组织它们?

  1. Frame
  2. Window
  3. Panel
  4. Dialog (对话框)
 

答案:C

解释:Java AWT 中的 Panel 是一个通用的容器,没有标题栏、边框或菜单栏。它通常用作轻量级容器,用于容纳和组织按钮、文本字段和标签等组件。Panel 可以添加到其他容器(如 Frame 或 Dialog)中,以定义用于使用 FlowLayout 或 GridLayout 等布局管理器排列组件的特定区域。


5. Component 类在 Java AWT 中用于设置组件背景颜色的方法是哪个?

  1. setBackgroundColor(Color c)
  2. setBackground(Color c)
  3. setComponentBackground(Color c)
  4. setBGColor(Color c)
 

答案:B

解释:在 Java AWT 中,Component 类的 setBackground(Color c) 方法用于将组件的背景颜色设置为指定的颜色 c。它允许开发人员根据应用程序的需求更改组件的背景颜色来定制组件的外观。


下一主题Java AWT 组件