Java 事件適配器 Adapter


 

事件適配器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教學視頻。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM