11.5.3 事件适配器

11.5.3 事件适配器

事件适配器的作用

事件适配器是监听器接口的空实现
事件适配器实现了监听器接口,并为该接口里的每个方法都提供了实现,这种实现是一种空实现(方法体内没有任何代码的实现)。

当需要创建监听器时,可以通过继承事件适配器,而不是实现监听器接口。因为事件适配器已经为监听器接口的每个方法提供了空实现,所以程序自己的监听器无须实现监听器接口里的每个方法,只需要重写自己感兴趣的方法,从而可以简化事件监听器的实现类代码

只有一个方法的监听器接口直接重写方法即可

如果某个监听器接口只有一个方法,则该监听器接口就无须提供适配器,因为该接口对应的监听器别无选择,只能重写该方法!如果不重写该方法,就没有必要实现该监听器。

表11.2 监听器接口和事件适配器对应表

监听器接口 事件适配器
ContainerListener ContainerAdapter
MouseListener MouseAdapter
FocusListener FocusAdapter
MouseMotionListener MouseMotionAdapter
ComponentListener ComponentAdapter
WindowListener WindowAdapter
KeyListener KeyAdapter

虽然表11.2中只列出了常用的监听器接口对应的事件适配器,实际上,所有包含多个方法的监听器接口都有对应的事件适配器,包括Swing中的监听器接口也是如此。

从表11.2中可以看出,所有包含多个方法的监听器接口都有一个对应的适配器,但只包含一个方法的监听器接口则没有对应的适配器

程序示例

下面程序通过事件适配器来创建事件监听器

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
import java.awt.*;
import java.awt.event.*;

public class WindowAdapterTest {
private Frame f = new Frame("测试");
private TextArea ta = new TextArea(6, 40);

public void init() {
f.addWindowListener(new MyListener());
f.add(ta);
f.pack();
f.setVisible(true);
}

class MyListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.out.println("用户关闭窗口!\n");
System.exit(0);
}
}

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

从上面程序中可以看出,窗口监听器继承WindowAdapter事件适配器,只需要重写windowClosing方法即可,这样当用户单击关闭按钮“×”时退出程序。