文档

Java™教程
隐藏目录
事件监听器简介
路径: 使用Swing创建GUI
课程: 编写事件监听器

事件监听器简介

如果您已经阅读过任何组件的 how-to 页面,您可能已经了解了事件监听器的基本知识。

让我们来看一个最简单的事件处理示例。它被称为 Beeper,当您点击按钮时,它会发出嘟嘟声。

点击“启动”按钮以使用Java™ Web Start下载 JDK 7 或更高版本)运行 Beeper。或者,要自己编译和运行示例,请参阅示例索引

启动 Beeper 示例
点击我 Beeper 按钮

您可以在Beeper.java中找到整个程序。下面是实现按钮事件处理的代码:

public class Beeper ... implements ActionListener {
    ...
    //初始化位置:
        button.addActionListener(this);
    ...
    public void actionPerformed(ActionEvent e) {
        ...//发出嘟嘟声...
    }
}

Beeper 类实现了 ActionListener 接口,该接口包含一个方法:actionPerformed。由于 Beeper 实现了 ActionListener,所以 Beeper 对象可以作为监听器注册到按钮发出的动作事件上。一旦使用 ButtonaddActionListener 方法注册了 Beeper,每次点击按钮时都会调用 BeeperactionPerformed 方法。

一个更复杂的示例

事件模型在前面的示例中是最简单的形式,但它非常强大和灵活。任意数量的事件监听器对象可以监听来自任意数量的事件源对象的各种事件。例如,一个程序可能为每个事件源创建一个监听器。或者一个程序可能对来自所有事件源的所有事件只有一个监听器。一个程序甚至可以对来自同一个事件源的同一类型的事件拥有多个监听器。

具有多个监听器的事件源

多个监听器可以注册以接收特定类型的来自特定源的事件通知。此外,同一个监听器可以监听来自不同对象的通知。

每个事件都由一个对象表示,该对象提供关于事件的信息并标识事件源。事件源通常是组件或模型,但也可以是其他类型的对象。

每当您想要检测特定组件的事件时,首先检查该组件的操作方法部分。组件的操作方法部分的列表在这里。操作方法部分提供了处理您最关心的事件的示例。例如,在如何使用颜色选择器中,您将找到一个编写更改监听器以跟踪颜色选择器中颜色更改的示例。

以下示例演示了事件监听器可以在多个对象上注册,并且相同的事件可以发送给多个监听器。示例包含两个事件源(JButton实例)和两个事件监听器。其中一个事件监听器(名为MultiListener的类的一个实例)同时监听来自两个按钮的事件。当它接收到一个事件时,它将事件的“操作命令”(设置为按钮标签上的文本)添加到顶部文本区域。第二个事件监听器(名为Eavesdropper的类的一个实例)仅监听一个按钮上的事件。当它接收到一个事件时,它将操作命令添加到底部文本区域。

MultiListener and Eavesdropper responses to buttons

请尝试以下操作: 
  1. 点击“启动”按钮以使用Java™ Web Start运行MultiListener(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引启动MultiListener示例
  2. 点击“胡言乱语”按钮。只有MultiListener对象被注册以监听此按钮。
  3. 点击“你不说话!”按钮。MultiListener对象和Eavesdropper对象都被注册以监听此按钮。

您可以在MultiListener.java中找到完整的程序。下面是实现按钮的事件处理的代码:

public class MultiListener ... implements ActionListener {
    ...
    // 初始化部分:
        button1.addActionListener(this);
        button2.addActionListener(this);

        button2.addActionListener(new Eavesdropper(bottomTextArea));
    }

    public void actionPerformed(ActionEvent e) {
        topTextArea.append(e.getActionCommand() + newline);
    }
}

class Eavesdropper implements ActionListener {
    ...
    public void actionPerformed(ActionEvent e) {
        myTextArea.append(e.getActionCommand() + newline);
    }
}

在上面的代码中,MultiListenerEavesdropper 都实现了 ActionListener 接口,并使用 JButtonaddActionListener 方法注册为事件监听器。这两个类的 actionPerformed 方法的实现相似:它们只是将事件的动作命令添加到一个文本区域中。


上一页: 编写事件监听器
下一页: 关于编写事件监听器的一般信息