事件适配器
为简化程序员的编程负担,JDK中针对大多数事件监听器接口提供了相应的实现类(事件适配器Adapter),在适配器中,实现了相应监听器接口的所有方法,但不做任何处理,即只是添加了一个空的方法体。
WindowAdapter适配器的定义:
package java.awt.event;
public abstract class WindowAdapterimplements WindowListener{
voidwindowClosing(WindowEvent){}
voidwindowOpened(WindowEvent e){}
voidwindowIconified(WindowEvent e){}
voidwindowDeiconified(WindowEvent e){}
voidwindowClosed(WindowEvent e){}
voidwindowActivated(WindowEvent e){}
voidwindowDeactivated(WindowEvent e){}
}
程序员在定义监听器类时就可以不再直接实现监听接口,而是继承事件适配器类,并只重写所需要的方法即可。
JDK中并没有为所有的监听器接口都提供相应的适配器类。
监听器接口 | 对应适配器 | 说明 |
MouseListener | MouseAdapter | 鼠标事件适配器 |
MouseLotionListener | MouseMotionAdapter | 鼠标运动事件适配器 |
WindowListener | WindowAdapter | 窗口事件适配器 |
FocusListener | FocusAdapter | 焦点事件适配器 |
KeyListener | KeyAdapter | 键盘事件适配器 |
ComponentListener | ComponentAdapter | 组件事件适配器 |
ContainerListener | ContainerAdapter | 容器事件适配器 |
示例3:改进的窗口事件处理。
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
public class MyAdapter extendsWindowAdapter{
publicvoid windowClosing(WindowEvent e){
System.exit(0);
}
}
使用适配器类的优点:不用实现WindowListener接口中所有的抽象方法,需要哪个方法,重写哪个方法即可,使开发者得以解脱。
但需注意:适配器类并不能完全取代相应的监听器接口,由于Java 单继承机制的限制,如果要定义的监听器类需要同时处理两种以上的GUI事件,则只能直接实现有关的监听器接口,而无法只通过继承适配器实现。
内部类和匿名类在GUI 事件处理中的作用
内部类
在Java GUI 事件处理中,经常采用内部类来定义监听器类,这是因为监听器类中封装的业务逻辑具有非常强的针对性,通常没有重用价值。而且作为内部类的监听器对象可以直接访问外部类中的成员,这可以提供很大的便利。
示例4:在GUI 事件处理中使用内部类。
public class MyFrame extends Frame{
…
}
匿名类
addMouseMotionListener(newMouseMotionAdapter(){
publicvoid mouseDragged(MouseEvent e){
txtDisplay.setText("鼠标位置"+e.getPoint());
}
});
多重监听
由于事件源可以产生多种不同类型的事件,因而可以注册多种不同类型的监听器,但是当事件源发生了某种类型的事件时,只触发事先已就该种事件类型注册过的监听器。
事件源组件和监听器对象的对应关系:
针对同一个事件源组件的同一种事件也可以注册多个监听器。
针对同一个事件源组件的多种事件也可以注册同一个监听器对象进行处置。只是这要求监听器对象是一个“多面手”,即有能力处理各种不同类型的事件
同一个监听器对象可以被同时注册到多个不同的事件源上。