イベントリスナーオブジェクトのいくつかの形式を実装します.

7654 ワード

イベントリスナーは特殊なjavaオブジェクトです.インプリメンテーション・イベント・リスナー・オブジェクトには、内部クラスの形式があります.イベント・リスナーを現在のクラスの内部クラスとして定義します.前の例のプログラムが内部クラスの形式であるように、外部クラス形式:イベントリスナーをイベントリスナークラスとして定義します.現在のクラス自体にリスナーインタフェースを実装するか、イベントアダプタの匿名内部クラス形式を継承します.匿名内部クラスを使用してリスナーオブジェクトを作成します.
——————————————————————————————————————————————
外部クラスを使用してListenerを実装する:外部クラスを使用してListenerを実装するのは比較的に珍しく、主に2つの原因がある:(1)イベントListenerは通常特定のGUIページに属し、外部クラスがプログラムの集約性を高めるのに不利であると定義する(2)外部クラス形式のListenerは複数のGUIインタフェースクラスのコンポーネントに自由にアクセスできず、プログラミングが簡潔ではない.
しかしながら、あるイベントリスナーが複数のGUIインタフェースによって共有される必要があり、主に何らかのビジネスロジックの実装を完了する必要がある場合、外部クラスの形式を用いてイベントリスナーを定義することが考えられる.
//次のプログラムは、メールを送信する機能を実現するイベントリスナークラスとして外部クラスを定義します.
package com.zou;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MailerListener implements ActionListener { 
    private TextField mailAdress; 

    public MailerListener() {} 
    public MailerListener(TextField mailAdress) { 
        this.mailAdress = mailAdress; 
    } 

    public TextField getMailAdress() { 
        return mailAdress; 
    } 
    public void setMailAdress(TextField mailAdress) { 
        this.mailAdress = mailAdress; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
        // TODO Auto-generated method stub 
        System.out.println("sending mail to '" + mailAdress.getText() + ".'
"
); } }
//                      (              )

package com.zou;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class AwtTest extends WindowAdapter { //            

    @Override 
    public void windowClosing(WindowEvent e) { 
        // TODO Auto-generated method stub 
        // super.windowClosing(e); 
        System.exit(0); 
    } 

    public void init() { 
        Frame f = new Frame("Sending Mail Test"); 
        TextField tf = new TextField(40); 
        Button btn = new Button("send"); 

        f.addWindowListener(this); 
        btn.addActionListener(new MailerListener(tf)); 

        f.add(tf); 
        f.add(btn, BorderLayout.SOUTH); 

        f.pack(); 
        f.setVisible(true); 
    } 

    public static void main(String[] args) { 
        new AwtTest().init(); 
    } 

} 


クラス自体はイベントリスナークラスとして:クラス自体はイベントリスナークラスとしてGUIインタフェースクラスを直接リスナークラスとして使用し、GUIインタフェースクラスでイベントプロセッサ方法を直接定義することができ、この方式は比較的簡潔で、初期のAWTプログラミングが好んで採用した形式であるが、この方式には2つの欠点がある:a.この形式は混乱したプログラム構造をもたらす可能性がある.GUIインタフェースの主な役割はインタフェースの初期化作業を完了することであるため、プログラムの可読性を低下させるb.GUIインタフェースクラスがイベントアダプタを継承する必要がある場合、そのGUIインタフェースクラスは他の親クラスを継承できない.
//以下のプログラムはGUIインタフェースクラスをイベントリスナークラスとして使用する:import java.awt.Frame; import java.awt.TextArea; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; //GUIインタフェースクラスは、WindowAdapterをインタフェースリスナークラスpublic class SimpleEventHandler extends WindowAdapter{Frame f=new Frame("クラス自体のイベントリスナー");TextArea ta=new TextArea(6,60);public void init()/このクラスのデフォルトオブジェクトをイベントリスナーオブジェクトf.addWindowListener(this);f.add(ta);f.pack();f.setVisible(true);
 }

 //GUI             
 public void windowClosing(WindowEvent e){
       System.out.println("      ");
       System.exit(0);
 }
 public static void main(String[] args){
       new SimpleEventHandler().init();
 }

}
匿名内部クラス実装リスナー:(1)ほとんどの場合、イベントプロセッサは多重化の価値がない(多重化可能なコードは通常ビジネスロジックメソッドとして抽象化される)ため、ほとんどのイベントリスナーは一時的に1回しか使用されないため、匿名内部クラス形式のイベントリスナーを使用するのがより適切である.実際には、現在最も広く使用されているイベントリスナー形式である.
サンプルコード:
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class AnonymousEventHandler{
     Frame f = new Frame("  ");
     TextArea ta=new TextArea(6,40);
     public void init(){
           //                 
           f.addWindowListener(new WindowAdapter() {
                //        
                public void windowClosing(WindowEvent e){
                     System.out.println("        ");
                     System.exit(0);

                }
           });
           f.add(ta);
           f.pack();
           f.setVisible(true);
     }
     public static void main(String[] args){
           new AnonymousEventHandler().init();
     }
}