本教程适用于JDK 8。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参阅Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发布说明。
动作监听器可能是最简单且最常见的事件处理器。您可以实现一个动作监听器来定义用户执行某个操作时应该执行的操作。
每当用户执行某个操作时,就会发生一个动作事件。例如:当用户点击一个按钮、选择一个菜单项、在文本框中按Enter键。结果是向在相关组件上注册的所有动作监听器发送一个actionPerformed
消息。
编写动作监听器的步骤如下:
public class MyClass implements ActionListener {
someComponent.addActionListener(instanceOfMyClass);
public void actionPerformed(ActionEvent e) { ...//对操作作出反应的代码... }
通常情况下,要检测用户何时点击屏幕上的按钮(或执行键盘等效操作),程序必须拥有一个实现ActionListener接口的对象。程序必须使用addActionListener方法将此对象注册为按钮(事件源)的动作监听器。当用户点击屏幕上的按钮时,按钮会触发一个动作事件。这会导致调用动作监听器的actionPerformed方法(ActionListener接口中唯一的方法)。该方法的参数是一个ActionEvent对象,该对象提供有关事件及其来源的信息。
让我们编写一个简单的程序,显示用户点击按钮的次数。首先,这是设置TextField、按钮和numClicks变量的代码:
public class AL extends Frame implements WindowListener,ActionListener { TextField text = new TextField(20); Button b; private int numClicks = 0;
在上面的示例中,事件处理器类是AL,它实现了ActionListener。
我们希望处理按钮点击事件,因此我们将一个动作监听器添加到按钮b上,代码如下:
b = new Button("Click me"); b.addActionListener(this);
在上面的代码中,按钮b是一个组件,事件处理器类AL的一个实例已经注册到该按钮上。
现在,我们想要显示文本,显示用户点击按钮的次数。我们可以通过编写以下代码来实现:
public void actionPerformed(ActionEvent e) { numClicks++; text.setText("按钮点击了 " + numClicks + " 次");
现在,当用户点击按钮b时,按钮会触发一个动作事件,该事件会调用动作监听器的actionPerformed方法。每次用户按下按钮时,numClicks变量都会递增,并且消息会显示在文本字段中。
这是完整的程序(AL.java):
import java.awt.*; import java.awt.event.*; public class AL extends Frame implements WindowListener,ActionListener { TextField text = new TextField(20); Button b; private int numClicks = 0; public static void main(String[] args) { AL myWindow = new AL("我的第一个窗口"); myWindow.setSize(350,100); myWindow.setVisible(true); } public AL(String title) { super(title); setLayout(new FlowLayout()); addWindowListener(this); b = new Button("点击我"); add(b); add(text); b.addActionListener(this); } public void actionPerformed(ActionEvent e) { numClicks++; text.setText("按钮点击了 " + numClicks + " 次"); } public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } public void windowOpened(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} }
更多示例:在本教程的事件介绍中有一个Beeper
程序示例,可以在Introduction to Event Listeners中找到。您可以在Beeper.java
中找到完整的程序。该部分描述的另一个示例MultiListener.java
有两个动作源和两个动作监听器,一个监听器监听两个源,另一个只监听一个源。
因为 ActionListener
只有一个方法,所以没有相应的适配器类。
方法 | 目的 |
---|---|
actionPerformed(actionEvent) | 用户执行操作后调用。 |
方法 | 目的 |
---|---|
String getActionCommand() | 返回与此操作关联的字符串。大多数可以触发动作事件的对象都支持一个名为 setActionCommand 的方法,用于设置该字符串。 |
int getModifiers() | 返回表示用户在发生动作事件时按下的修饰键的整数。可以使用 ActionEvent 定义的常量 SHIFT_MASK 、CTRL_MASK 、META_MASK 和 ALT_MASK 来确定按下了哪些键。例如,如果用户 Shift-选择一个菜单项,则以下表达式非零:
actionEvent.getModifiers() & ActionEvent.SHIFT_MASK |
Object getSource() (在 java.util.EventObject 中) |
返回触发事件的对象。 |
以下表列出了一些使用动作监听器的示例。
示例 | 描述位置 | 注释 |
---|---|---|
Beeper |
本节和事件监听器简介 | 包含一个按钮和一个动作监听器,当点击按钮时发出蜂鸣声。 |
MultiListener |
事件监听器简介 | 在一个按钮上注册两个不同的动作监听器。还在两个不同的按钮上注册了相同的动作监听器。 |
RadioButtonDemo |
如何使用单选按钮 | 在五个单选按钮上注册相同的动作监听器。监听器使用getActionCommand 方法确定哪个单选按钮触发了事件。 |
MenuDemo |
如何使用菜单 | 演示如何监听菜单项的动作事件。 |
TextDemo |
如何使用文本框 | 一个在文本框上注册动作监听器的小程序。 |
IconDemo |
如何使用图标 | 在动作监听器中加载图像。由于加载图像可能需要一段时间,该程序使用SwingWorker 在后台线程中加载图像。 |
TableDialogEditDemo |
如何使用表格 | 通过颜色选择对话框的“确定”按钮上的工厂方法注册一个动作监听器。 |
SliderDemo |
如何使用滑块 | 在控制动画循环的定时器上注册一个动作监听器。 |