监听器和适配器是Java图形用户界面(GUI,Graphics User interface)设计的抽象窗口工具集(AWT,Abstract Window Toolkit)的两个重要概念,他们都在java.awt包中。JDK1.1引入了委托事件模型,监听器和适配器就是这一模型的具体实现,所以理解他们就变得非常重要,初学者可能对于这两个概念有点陌生,为了节省他们看长编大论再自己总结的时间,我在这里就把自己的理解写出来,抛砖引玉。
1.委托事件模型
要理解监听器和适配器,那么一定要了解委托事件模型,它区别于层次事件模型(JDK1.1以前的Java标准),根据不同的用户操作,产生不同的事件(Event类),并为每个事件类定义了事件对象的接受和处理方法,这些方法都包括在我们的监听器(Listener Interfance)里面,我们注册相应的事件监听程序后,就可以接受事件对象,实现相应的方法。
2.监听器和适配器是什么?
如果一个类里声明了抽象方法,那么它也必须声明为抽象的。换句话说,包含有抽象方法的类就是抽象类。
如果一个类里面的方法都是抽象的,那么它就是一个接口,也就是说,接口是一种特殊的抽象类。(当然,抽象类跟接口是有区别的,本文并不深入讨论这个问题)
事件的监听程序(Listener)是接口中的一个未实现的方法。
很明显,监听器实质上就是一个接口(Interface)。
适配器(Adapter)是跟监听器一一对应的类。它实现了对应监听器中的所有方法,但都是空方法。注意:适配器是一个抽象类(abstract class)
3.适配器和监听器的使用
在实际使用中,适配器只是作为方便程序员编程的一个手段,一般情况下程序员都要重写适配器中某些需要的方法,以达到所要的功能,如果只是一个适配器,那么它什么也不干。
当然你也完全可以不用适配器,自己把监听器里面的方法全写一遍,那么在功能上是没什么不同的。也就是说有两种完成的方式:
①需要注册监听程序的类实现接口(监听器),然后重写接口中的所有方法
②需要注册监听程序的类实现接口(监听器),然后继承适配器,再重写需要的方法
4.需要注意的地方
Ⅰ 有些教材把事件监听程序(Listener)等同于监听器(Listener Interface),本人觉得它们应该是接口中的方法与接口的关系,另外也有人把监听器称为监听者。
Ⅱ 监听器是接口,是需要实现(implements)的,适配器是抽象类,是需要继承(extends)的。而由于适配器已经实现了对应的监听器,故继承了适配器的类不用再声明实现对应的监听器,就可以注册对应的监听程序。
例如:public class Calc1 extends WindowAdapter implements ActionListener,ItemListener
{
Frame f;
TextField tf1;
Checkbox cb1;
……
public void display()
{
……
tf1.addActionListener(this); //实现了ActionListener,故可以注册对应的ActionListener
cb1.addItemListener(this); //实现了ItemListener,故可以注册对应ItemListener
f.addWindowListener(this); //继承了WindowAdapter,也可以注册对应的WindowListener
……
}
……
}
Ⅲ 在实际使用中,由于Java只能单继承,对于接口和抽象类的选择就需慎重考虑,同样的一个类只能继承一个适配器,这也意味着其它的监听程序就需要手动实现,在优秀的编辑工具下这个工作量也许并不大,但也可以尝试把监听器交给别的类(比如类A)来实现,而类A就可以继承对应的适配器,这才是Java的单继承多接口机制的思想所在。