11.5 事件处理 11.5.1 Java事件模型的流程

11.5 事件处理

前面介绍了如何放置各种组件,从而得到了丰富多彩的图形界面,但这些界面还不能响应用户的任何操作。比如单击前面所有窗口右上角的“×”按钮,但窗口依然不会关闭。因为在AWT编程中,所有事件必须由特定对象(事件监听器)来处理,而Frame和组件本身并没有事件处理能力

11.5.1 Java事件模型的流程

为了使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制。

事件处理三要素

在事件处理的过程中,主要涉及三类对象。

  • EventSource(事件源):事件发生的场所,通常就是各个组件,例如按钮、窗口、菜单等。
  • Event(事件):事件封装了GUI组件上发生的特定事情(通常就是一次用户操作)。如果程序需要获得GUI组件上所发生事件的相关信息,都通过Event对象来取得
  • EventListener(事件监听器):负责监听事件源所发生的事件,并对各种事件做出响应处理。

当用户单击一个按钮,或者单击某个菜单项,或者单击窗口右上角的状态按钮时,这些动作就会触发一个相应的事件,该事件由AWT封装成相应的Event对象,该事件会触发事件源上注册的事件监听器(特殊的Java对象),事件监听器调用对应的事件处理器(事件监听器里的实例方法)来做出相应的响应。

委派式事件处理方式

AWT的事件处理机制是一种委派式(Delegation)事件处理方式:
普通组件(事件源)将事件的处理工作委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。

每个组件均可以针对特定的事件指定一个或多个事件监听对象,每个事件监听器也可以监听一个或多个事件源。因为同一个事件源上可能发生多种事件,委派式事件处理方式可以把事件源上可能发生的不同的事件分别授权给不同的事件监听器来处理;同时也可以让一类事件都使用同一个事件监听器来处理。

生活中的委派式事件处理方式

例如某个单位如果发生了打架斗殴事件,则委派给公安局(事件监听器)处理;
而公安局也会同时监听这些打架斗殴事件。

这种委派式处理方式将事件源和事件监听器分离,从而提供更好的程序模型,有利于提高程序的可维护性

图11.20显示了AWT的事件处理流程示意图

这里有一张图片

程序示例

下面以一个简单的HelloWorld程序来示范AWT事件处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.awt.*;
import java.awt.event.*;

public class EventQs {
private Frame f = new Frame("测试事件");
private Button ok = new Button("确定");
private TextField tf = new TextField(30);

public void init() {
// 注册事件监听器
ok.addActionListener(new OkListener()); // 1
f.add(tf);
f.add(ok, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}

// 定义事件监听器类
class OkListener implements ActionListener // 2
{
// 下面定义的方法就是事件处理器,用于响应特定的事件
public void actionPerformed(ActionEvent e) // 3
{
System.out.println("用户单击了ok按钮");
tf.setText("Hello World");
}
}

public static void main(String[] args) {
new EventQs().init();
}
}

上面程序 3 号代码定义的方法就是事件处理器。当程序中的Oκ按钮被单击时,该处理器被触发,将看到程序中t文本框内变为“HelloWorld”,而程序控制台打印出“用户单击了OK按钮”字符串。

运行效果如下图所示:

AWT事件处理机制步骤

从上面程序中可以看出,实现AWT事件处理机制的步骤如下:

  • 实现事件监听器类,该监听器类是一个特殊的Java类,必须实现一个XxxListener接口。
  • 创建普通组件(事件源),创建事件监听器对象。
  • 调用addXxxListener()方法将事件监听器对象注册给普通组件(事件源)。当事件源上发生指定事件时,AWT会触发事件监听器,由事件监听器调用相应的方法(事件处理器)来处理事件,事件源上所发生的事件会作为参数传入事件处理器。