Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言变更。
有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息,请参阅JDK发行说明。
如果您已经阅读过任何组件的 how-to 页面,您可能已经了解了事件监听器的基本知识。
让我们来看一个最简单的事件处理示例。它被称为 Beeper,当您点击按钮时,它会发出嘟嘟声。
点击“启动”按钮以使用Java™ Web Start(下载 JDK 7 或更高版本)运行 Beeper。或者,要自己编译和运行示例,请参阅示例索引。
您可以在Beeper.java
中找到整个程序。下面是实现按钮事件处理的代码:
public class Beeper ... implements ActionListener { ... //初始化位置: button.addActionListener(this); ... public void actionPerformed(ActionEvent e) { ...//发出嘟嘟声... } }
Beeper
类实现了 ActionListener
接口,该接口包含一个方法:actionPerformed
。由于 Beeper
实现了 ActionListener
,所以 Beeper
对象可以作为监听器注册到按钮发出的动作事件上。一旦使用 Button
的 addActionListener
方法注册了 Beeper
,每次点击按钮时都会调用 Beeper
的 actionPerformed
方法。
事件模型在前面的示例中是最简单的形式,但它非常强大和灵活。任意数量的事件监听器对象可以监听来自任意数量的事件源对象的各种事件。例如,一个程序可能为每个事件源创建一个监听器。或者一个程序可能对来自所有事件源的所有事件只有一个监听器。一个程序甚至可以对来自同一个事件源的同一类型的事件拥有多个监听器。
多个监听器可以注册以接收特定类型的来自特定源的事件通知。此外,同一个监听器可以监听来自不同对象的通知。
每个事件都由一个对象表示,该对象提供关于事件的信息并标识事件源。事件源通常是组件或模型,但也可以是其他类型的对象。
每当您想要检测特定组件的事件时,首先检查该组件的操作方法部分。组件的操作方法部分的列表在这里。操作方法部分提供了处理您最关心的事件的示例。例如,在如何使用颜色选择器中,您将找到一个编写更改监听器以跟踪颜色选择器中颜色更改的示例。
以下示例演示了事件监听器可以在多个对象上注册,并且相同的事件可以发送给多个监听器。示例包含两个事件源(JButton
实例)和两个事件监听器。其中一个事件监听器(名为MultiListener
的类的一个实例)同时监听来自两个按钮的事件。当它接收到一个事件时,它将事件的“操作命令”(设置为按钮标签上的文本)添加到顶部文本区域。第二个事件监听器(名为Eavesdropper
的类的一个实例)仅监听一个按钮上的事件。当它接收到一个事件时,它将操作命令添加到底部文本区域。
MultiListener
对象被注册以监听此按钮。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); } }
在上面的代码中,MultiListener
和 Eavesdropper
都实现了 ActionListener
接口,并使用 JButton
的 addActionListener
方法注册为事件监听器。这两个类的 actionPerformed
方法的实现相似:它们只是将事件的动作命令添加到一个文本区域中。