12.1.8 Java中的应用-AWT事件适配器(接口的适配器模式)
从以上的学习我们已经了解到,基于接口的适配器模式是采用抽象化接口的方式,来达到节省接口函数的目的,这一特性特别适合于Java AWT中的事件处理模式。对于定义的事件监听器接口,它可能包含多个事件处理函数,但在使用时我们往往只需要关注其中的某一种事件,此时就可以使用抽象化适配来将事件监听器接口进行抽象化,给出每一个接口函数的默认实现,这样在需要使用时只需要重写自己需要的函数即可,如图12-8所示。
从图中可以看出,共分为3层:
***层是EventListener顶层事件接口类,它只是定义了一个接口,没有包含任何接口函数。
第二层是AWT的事件监听器接口(以Listener为结尾),每一个监听器接口对应一种窗口事件,其中定义了多个事件处理函数。
第三层是AWT的事件适配器抽象类(以Adapter为结尾),它们分别为对应的监听器接口提供了默认的函数实现。
所有的适配器抽象类都采用了接口的适配器模式来实现。例如,鼠标监听器接口中定义了5个鼠标事件接口函数,如程序12-16所示。
程序12-16 鼠标监听器接口
MouseListener.javapackagejava.awt.event;
importjava.util.EventListener;
publicinterfaceMouseListenerextendsEventListener {
/**
* 鼠标单击事件
*/
publicvoidmouseClicked(MouseEvent e);
/**
* 鼠标按下事件
*/
publicvoidmousePressed(MouseEvent e);
/**
* 鼠标释放事件
*/
publicvoidmouseReleased(MouseEvent e);
/**
* 鼠标进入事件
*/
publicvoidmouseEntered(MouseEvent e);
/**
* 鼠标退出事件
*/
publicvoidmouseExited(MouseEvent e);
}
当我们要使用该接口编写鼠标事件处理代码时,就需要实现该接口,并实现5个事件函数,如程序12-17所示。
程序12-17 自定义的鼠标实现类importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
publicclassMyMouseListenerimplementsMouseListener {
@Override
publicvoidmouseClicked(MouseEvent arg0) {
System.out.println("鼠标单击事件");
}
@Override
publicvoidmousePressed(MouseEvent arg0) {
System.out.println("鼠标按下事件");
}
@Override
publicvoidmouseReleased(MouseEvent arg0) {
System.out.println("鼠标释放事件");
}
@Override
publicvoidmouseEntered(MouseEvent arg0) {
System.out.println("鼠标进入事件");
}
@Override
publicvoidmouseExited(MouseEvent arg0) {
System.out.println("鼠标退出事件");
}
}
然而,我们可能只需要处理其中的某一个事件,却不得不编写所有的接口函数,此时就可以使用适配器类MouseAdapter了。
该适配器实现了3个鼠标相关的事件接口,并为这些接口中的所有函数都提供了默认的实现,这些实现的代码为空,表示什么也不做,如程序12-18所示。
程序12-18 鼠标事件适配器
MouseAdapter.javapackagejava.awt.event;
publicabstractclassMouseAdapterimplementsMouseListener,
MouseWheelListener, MouseMotionListener {
publicvoidmouseClicked(MouseEvent e) {}
publicvoidmousePressed(MouseEvent e) {}
publicvoidmouseReleased(MouseEvent e) {}
publicvoidmouseEntered(MouseEvent e) {}
publicvoidmouseExited(MouseEvent e) {}
publicvoidmouseWheelMoved(MouseWheelEvent e){}
publicvoidmouseDragged(MouseEvent e){}
publicvoidmouseMoved(MouseEvent e){}
}
此时如果我们只希望处理鼠标单击事件,只需要继承适配器MouseAdapter,
并重写单击事件函数mouseClicked()即可,如程序12-19所示。
程序12-19单击事件处理程序MyMouseClickedListener.java
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseAdapter;
publicclassMyMouseClickedListenerextendsMouseAdapter {
@Override
publicvoidmouseClicked(MouseEvent arg0) {
System.out.println("鼠标单击事件");
}
}
由此可见,通过使用事件的适配器,可以让我们的代码只关注自己的事件,而不必造成不必要的代码浪费。这就是适配器模式在事件处理中的应用。