事件適配器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); // 加上鼠標動作監聽器,因為類本身實現了這兩個接口,所以參數是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教學視頻。