JavaSwing事件处理与常用组件使用指南
立即解锁
发布时间: 2025-08-18 02:31:37 阅读量: 2 订阅数: 9 

### Java Swing 事件处理与常用组件使用指南
#### 1. 事件源与监听器基础
在 Java 的 Swing 编程中,事件源是生成事件的对象。当事件源生成一个事件时,它会将该事件发送给所有已注册的监听器。因此,监听器若要接收事件,就必须向事件源进行注册。在 Swing 里,监听器通过调用事件源对象的方法来完成注册,每种事件都有其对应的注册方法,通常遵循如下命名约定:
```java
public void addTypeListener(TypeListener el)
```
其中,`Type` 是事件的名称,`el` 是事件监听器的引用。例如,注册键盘事件监听器的方法是 `addKeyListener()`,注册鼠标移动监听器的方法是 `addMouseMotionListener()`。当事件发生时,该事件会被传递给所有已注册的监听器。
事件源还需提供一个方法,允许监听器取消对特定类型事件的关注。在 Swing 中,此类方法的命名约定如下:
```java
public void removeTypeListener(TypeListener el)
```
同样,`Type` 是事件的名称,`el` 是事件监听器的引用。例如,要移除键盘监听器,可调用 `removeKeyListener()`。
事件监听器是在事件发生时会收到通知的对象,它有两个主要要求:一是必须向一个或多个事件源注册,以接收特定类型的事件;二是必须实现一个方法来接收和处理该事件。
处理 Swing 事件的方法定义在一组接口中,如 `java.awt.event` 和 `javax.swing.event` 中的接口。例如,`ActionListener` 接口定义了一个处理 `ActionEvent` 的方法。任何实现了 `ActionListener` 接口的对象都可以接收和处理该事件。
需要注意的是,事件处理程序应快速完成任务并返回。在大多数情况下,不应进行长时间的操作,因为这会拖慢整个应用程序。若需要进行耗时操作,应为此创建一个单独的线程。
#### 2. 事件类与监听器接口
代表事件的类是 Swing 事件处理机制的核心。事件类层次结构的根是 `EventObject`,它位于 `java.util` 包中,是 Java 中所有事件的超类。`java.awt` 包中声明的 `AWTEvent` 类是 `EventObject` 的子类,它是委托事件模型所使用的所有基于 AWT 的事件的超类(直接或间接)。虽然 Swing 使用 AWT 事件,但它也添加了一些自己的事件,这些事件位于 `javax.swing.event` 包中。因此,Swing 支持大量的事件。
以下是本章使用的三个事件及其对应的监听器:
| 事件 | 对应的监听器 |
| ---- | ---- |
| ActionEvent | ActionListener |
| ItemEvent | ItemListener |
| ListSelectionEvent | ListSelectionListener |
#### 3. 使用 JButton
Swing 中最常用的控件之一是按钮,按钮是 `JButton` 的实例。`JButton` 继承自抽象类 `AbstractButton`,该类定义了所有按钮共有的功能。Swing 按钮可以包含文本、图像或两者兼有,这里仅使用基于文本的按钮。
`JButton` 提供了多个构造函数,这里使用的是:
```java
JButton(String msg)
```
其中,`msg` 指定了按钮内部显示的字符串。
当按下按钮时,它会生成一个 `ActionEvent`。`JButton` 提供了以下方法,用于添加或移除动作监听器:
```java
void addActionListener(ActionListener al)
void removeActionListener(ActionListener al)
```
这里,`al` 指定了一个将接收事件通知的对象,该对象必须是实现了 `ActionListener` 接口的类的实例。
`ActionListener` 接口仅定义了一个方法:`actionPerformed()`,如下所示:
```java
void actionPerformed(ActionEvent ae)
```
当按钮被按下时,会调用此方法。也就是说,它是按钮按下事件发生时调用的事件处理程序。`actionPerformed()` 的实现必须快速响应事件并返回。
使用传递给 `actionPerformed()` 的 `ActionEvent` 对象,可以获取与按钮按下事件相关的一些有用信息。本章使用的是与按钮关联的动作命令字符串,默认情况下,它就是按钮内部显示的字符串。通过在事件对象上调用 `getActionCommand()` 方法可以获取该动作命令:
```java
String getActionCommand()
```
动作命令用于标识按钮。因此,在同一应用程序中使用两个或多个按钮时,动作命令能让你轻松确定按下了哪个按钮。
以下是创建按钮并响应按钮按下事件的示例程序流程:
1. 导入 `java.awt` 和 `java.awt.event` 包,因为 `java.awt` 包包含支持流式布局管理器的 `FlowLayout` 类,`java.awt.event` 包定义了 `ActionListener` 接口和 `ActionEvent` 类。
2. 声明 `ButtonDemo` 类并实现 `ActionListener` 接口,以便 `ButtonDemo` 对象可以接收动作事件。
3. 声明一个 `JLabel` 引用,用于在 `actionPerformed()` 方法中显示按下了哪个按钮。
4. 在 `ButtonDemo` 构造函数中创建一个 `JFrame`,并将其内容面板的布局管理器设置为 `FlowLayout`。
5. 设置框架的大小和默认关闭操作。
6. 创建两个按钮,分别显示 "Up" 和 "Down"。
7. 将 `ButtonDemo` 实例作为动作监听器添加到按钮上。
8. 当按钮被按下时,生成 `ActionEvent`,并调用 `actionPerformed()` 方法,通过 `getActionCommand()` 获取动作命令,根据命令内容设置标签文本,显示按下的按钮。
```mermaid
graph LR
A[导入必要包] --> B[声明 ButtonDemo 类并实现 ActionListener]
B --> C[声明 JLabel 引用]
C --> D[创建 JFrame 并设置布局管理器]
D --> E[设置框架大小和关闭操作]
E --> F[创建两个按钮]
F --> G[添加动作监听器]
G --> H[按钮按下生成 ActionEvent]
H --> I[调用 actionPerformed 方法]
I --> J[获取动作命令并显示按下的按钮]
```
#### 4. 使用 JTextField
另一个常用的控件是 `JTextField`,它允许用户输入一行文本。`JTextField` 继承自抽象类 `JTextComponent`,该类是所有文本组件的超类。`JTextField` 定义了多个构造函数,这里使用的是:
```java
JTextField(int cols)
```
其中,`cols` 指定了文本字段的列宽。需要注意的是,你可以输入比列数更长的字符串,只是文本字段在屏幕上的物理大小为 `cols` 列宽。
当在文本字段中输入内容并按下回车键时,会生成一个 `ActionEvent`。因此,`JTextField` 提供了 `addActionListener()` 和 `removeActionListener()` 方法。要处理动作事件,必须实现 `ActionListener` 接口定义的 `actionPerformed()` 方法,其处理过程与处理按钮生成的动作事件类似。
与 `JButton` 一样,`JTextField` 也有一个关联的动作命令字符串。默认情况下,动作命令是文本字段的当前内容,但通常很少使用此默认值。相反,你可以通过调用 `setActionCommand()` 方法将动作命令设置为你自己选择的固定值:
```java
void setActionCommand(String cmd)
```
传入的 `cmd` 字符串将成为新的动作命令,文本字段中的文本不受影响。一旦设置了动作命令字符串,无论向文本字段中输入什么内容,它都将保持不变。明确设置动作命令的一个原因是提供一种识别文本字段作为动作事件源的方式,这在同一框架中的其他控件也会生成动作事件,且你希望使用相同的事件处理程序来处理这两个事件时尤为重要。设置动作命令
0
0
复制全文
相关推荐









