事件适配器Adapters
在上一篇文章中:
第二个例子中,可以看到要实现相应的事件监听器接口,就必须实现其中的所有方法。
有的接口中包含多个方法(多个事件处理器),而有时我们只需要其中的一两个,这时候其他方法就只是空实现。
为简化编程,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); // 加上鼠标动作监听器,因为类本身实现了这两个接口,所以参数是this frame.addMouseListener(this); frame.addMouseMotionListener(this); // 可以添加多个监听器,所以还可以定义其他的,如MyMouseListener类,然后加上 // 设置刚好能容纳这些控件的尺寸 frame.pack(); // 设置为可见 frame.setVisible(true); } public static void main(String[] args) { MyWindow window = new MyWindow(); window.go(); } @Override public void mouseMoved(MouseEvent e) { String str = "x = " + e.getX() + ", y = " + e.getY(); this.textField.setText(str); System.out.println(str); } @Override public void mouseExited(MouseEvent e) { this.textField.setText("the mouse has exited."); }}class MyButtonListener2 implements ActionListener{ // 因为ActionListener只有一个方法,所以没有适配器 @SuppressWarnings("deprecation") @Override public 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{ @Override public void windowClosing(WindowEvent e) { System.out.println("windowClosing"); // 退出 System.exit(0); }}
参考资料
张龙老师Java SE教学视频。