事件适配器Adapters
在上一篇文章中:
http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html
第二个例子中,可以看到要实现相应的事件监听器接口,就必须实现其中的所有方法。
有的接口中包含多个方法(多个事件处理器),而有时我们只需要其中的一两个,这时候其他方法就只是空实现。
为简化编程,JDK针对大多数事件监听器接口定义了相应的实现类,我们称之为事件适配器(Adapter)类。
在适配器类中,实现了相应监听器接口的所有方法,但不做任何事情,即这些Adapter类中的方法都是空的。
只要继承适配器类,就等于实现了相应的监听器接口。
如果要对某类事件的某种情况进行处理,只要覆盖相应的方法就可以了,其他的方法再也不用简单实现了。
所以你定义的Listener可以继承Adapter类,而且只需重写你所需要的方法。
但是要注意适配器这里用的是继承extends,而Java是单继承的机制。如果想用作事件监听器的类已经继承了别的类,就不能再继承适配器了,只能去实现事件监听器接口了。
程序实例
将上文中的例子用适配器重新实现以下,可以看到少了很多空方法。


package com.learnjava.awt;import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.Label; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.sql.Date;public class MyAdapterTest extends MouseAdapter {private Frame frame;private Label label;private Button button;private TextField textField;public void go(){frame = new Frame("My Frame");// 加上窗口监听器,其中主要实现了退出功能frame.addWindowListener(new MyWindowListener2());// 加一个标签label = new Label("This is my Window");frame.add(label, BorderLayout.NORTH);// 加一个按钮button = new Button("MyButton");frame.add(button, BorderLayout.WEST);// 设置按钮事件监听器,按钮按下时会向控制台输出信息button.addActionListener(new MyButtonListener2());// 加一个文本编辑框textField = new TextField(40);frame.add(textField, BorderLayout.SOUTH);// 加上鼠标动作监听器,因为类本身实现了这两个接口,所以参数是thisframe.addMouseListener(this);frame.addMouseMotionListener(this);// 可以添加多个监听器,所以还可以定义其他的,如MyMouseListener类,然后加上// 设置刚好能容纳这些控件的尺寸 frame.pack();// 设置为可见frame.setVisible(true);}public static void main(String[] args){MyWindow window = new MyWindow();window.go();}@Overridepublic void mouseMoved(MouseEvent e){String str = "x = " + e.getX() + ", y = " + e.getY();this.textField.setText(str);System.out.println(str);}@Overridepublic void mouseExited(MouseEvent e){this.textField.setText("the mouse has exited.");}}class MyButtonListener2 implements ActionListener {// 因为ActionListener只有一个方法,所以没有适配器 @SuppressWarnings("deprecation")@Overridepublic void actionPerformed(ActionEvent e){// 输出信息System.out.println("The Button is pressed!");// 输出时间戳Long time = e.getWhen();System.out.println("timestamp: " + time);// 日期时间Date date = new Date(time);System.out.println(date.toLocaleString());}}class MyWindowListener2 extends WindowAdapter {@Overridepublic void windowClosing(WindowEvent e){System.out.println("windowClosing");// 退出System.exit(0);}}
参考资料
张龙老师Java SE教学视频。