如何编写动作监听器

动作侦听器可能是最容易实现的(也是最常见的)事件处理程序。您实现一个动作侦听器,以定义当用户执行某些操作时应执行的操作。

每当用户执行动作时,就会发生动作事件。示例:用户单击button时,选择menu item,然后按text field中的 Enter 键。结果是actionPerformed消息发送到在相关组件上注册的所有操作侦听器。

要编写动作侦听器,请按照以下步骤操作:

  • 声明事件处理程序类,并指定该类实现 ActionListener interface或扩展实现 ActionListener interface的类。例如:
public class MyClass implements ActionListener {
  • 将事件处理程序类的实例注册为一个或多个组件上的侦听器。例如:
someComponent.addActionListener(instanceOfMyClass);
  • 包括在侦听器interface中实现方法的代码。例如:
public void actionPerformed(ActionEvent e) { 
    ...//code that reacts to the action... 
}

通常,要检测用户何时单击屏幕按钮(或键盘等效按钮),程序必须具有一个实现 ActionListener interface的对象。程序必须使用 addActionListener 方法将此对象注册为按钮(事件源)上的操作侦听器。当用户单击屏幕上的按钮时,该按钮将触发一个动作事件。这将导致调用动作侦听器的 actionPerformed 方法(ActionListener interface中的唯一方法)。该方法的单个参数是一个 ActionEvent 对象,该对象提供有关事件及其源的信息。

让我们编写一个简单的程序,该程序显示用户单击按钮的次数。首先,下面是设置 TextField,button 和 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);

在上面的代码中,Button b 是一个组件,在该组件上注册了事件处理程序类 AL 的实例。

现在,我们要显示有关用户单击按钮的次数的文本。我们可以通过编写如下代码来做到这一点:

public void actionPerformed(ActionEvent e) {
         numClicks++;
         text.setText("Button Clicked " + numClicks + " times");

现在,当用户单击 Button 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("My first window");
                myWindow.setSize(350,100);
                myWindow.setVisible(true);
        }

        public AL(String title) {

                super(title);
                setLayout(new FlowLayout());
                addWindowListener(this);
                b = new Button("Click me");
                add(b);
                add(text);
                b.addActionListener(this);
        }

        public void actionPerformed(ActionEvent e) {
                numClicks++;
                text.setText("Button Clicked " + numClicks + " times");
        }

        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程序示例在此跟踪的事件简介事件侦听器简介中可用。您可以在Beeper.java中找到整个程序。该部分中描述的另一个示例MultiListener.java具有两个动作源和两个动作侦听器,其中一个侦听器侦听两个源,另一个侦听器侦听一个源。

动作监听器 API

ActionListener interface

因为ActionListener只有一种方法,所以没有相应的适配器类.

MethodPurpose
actionPerformed(actionEvent)在用户执行操作后立即调用。

ActionEvent 类

MethodPurpose
String getActionCommand()返回与此操作关联的字符串。大多数可以触发动作事件的对象都支持称为setActionCommand的方法,该方法可让您设置此字符串。
int getModifiers()返回一个整数,该整数表示操作事件发生时用户按下的修饰键。您可以使用ActionEvent定义的常量SHIFT_MASKCTRL_MASKMETA_MASKALT_MASK来确定按下了哪些键。例如,如果用户按 Shift 键选择菜单项,则以下表达式为非零:

actionEvent.getModifiers() & ActionEvent.SHIFT_MASK
Object getSource()
(*在java.util.EventObject *中)
返回引发事件的对象。

使用动作侦听器的示例

下表列出了许多使用动作侦听器的示例。

ExampleWhere DescribedNotes
Beeper本部分和事件侦听器简介包含一个带有一个动作侦听器的按钮,当您单击该按钮时会发出蜂鸣声。
MultiListener事件侦听器简介在一个按钮上注册两个不同的动作侦听器。还在两个不同的按钮上注册相同的动作侦听器。
RadioButtonDemo如何使用单选按钮在五个单选按钮上注册相同的动作侦听器。侦听器使用getActionCommand方法确定哪个单选按钮触发了该事件。
MenuDemo如何使用菜单显示如何侦听菜单项上的动作事件。
TextDemo如何使用 Literals 栏位在文本字段上注册动作侦听器的 Servlets。
IconDemo如何使用图标将图像加载到动作侦听器中。由于加载图像可能需要一段时间,因此该程序使用SwingWorker在后台线程中加载图像。
TableDialogEditDemo如何使用表格通过工厂方法在颜色 selectors 对话框的“确定”按钮上注册动作侦听器。
SliderDemo如何使用滑块在控制动画循环的计时器上注册动作侦听器。