1

私は Java チュートリアルをオンラインで見てきましたが、それらはすべて、既に作成されている他のコンポーネントによって発行された ActionEvents をキャッチすることに関心があるようです。リスナーとして登録されている他のクラスがキャッチできる actionEvents をトリガーする独自の基準セットを持つ独自のオブジェクトを作成することは可能ですか?

たとえば、リスナーとして登録されたすべての寝台オブジェクトに 100 匹の羊が数えられたときに、羊を数えているオブジェクトが actionEvent を送信するようにしたいとします。

これを行う方法はありますか?オンラインのチュートリアルはありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

2

はい、誰かが独自のリスナーを作成する方法を示してくれれば、それは非常に簡単です。

まず、独自の EventObject を作成します。これは私のプロジェクトの例です。

import gov.bop.rabid.datahandler.bean.InmateDataBean;

import java.util.EventObject;

public class InmatePhotoEventObject extends EventObject {

    private static final long serialVersionUID = 1L;

    protected InmateDataBean inmate;

    public InmatePhotoEventObject(Object source) {
        super(source);
    }

    public InmateDataBean getInmate() {
        return inmate;
    }

    public void setInmate(InmateDataBean inmate) {
        this.inmate = inmate;
    }

}

このクラスには、EventObject を拡張する以外に特別なことはありません。コンストラクターは EventObject によって定義されますが、任意のメソッドを作成できます。

次に、EventListener インターフェイスを定義します。

public interface EventListener {

    public void handleEvent(InmatePhotoEventObject eo);

}

作成した EventObject を使用します。任意のメソッド名を使用できます。これは、リスナーへの応答として記述されるコードのインターフェイスです。

3 番目に、ListenerHandler を作成します。これが同じプロジェクトの私のものです。

import gov.bop.rabid.datahandler.bean.InmateDataBean;
import gov.bop.rabid.datahandler.main.EventListener;
import gov.bop.rabid.datahandler.main.InmatePhotoEventListener;
import gov.bop.rabid.datahandler.main.InmatePhotoEventObject;

import java.util.ArrayList;
import java.util.List;

public class InmatePhotoListenerHandler {

    protected List<EventListener> listeners;

    public InmatePhotoListenerHandler() {
        listeners = new ArrayList<EventListener>();
    }

    public void addListener(EventListener listener) {
        listeners.add(listener);
    }

    public void removeListener(EventListener listener) {
        for (int i = listeners.size() - 1; i >= 0; i--) {
            EventListener instance = listeners.get(i);
            if (instance.equals(listener)) {
                listeners.remove(i);
            }
        }
    }

    public void fireEvent(final InmatePhotoEventObject eo, 
            final InmateDataBean inmate) {
        for (int i = 0; i < listeners.size(); i++) {
            final EventListener instance = listeners.get(i);
            Runnable runnable = new Runnable() {
                public void run() {
                    eo.setInmate(inmate);
                    instance.handleEvent(eo);
                }

            };
            new Thread(runnable).start();
        }
    }

    public static void main(String[] args) {
        System.out.println("This line goes in your DataHandlerMain class "
                + "constructor.");
        InmatePhotoListenerHandler handler = new InmatePhotoListenerHandler();
        System.out.println("I need you to put the commented method in "
                + "DataHandlerMain so I can use the handler instance.");

        // public InmatePhotoListenerHandler getInmatePhotoListenerHandler() {
        //      return handler;
        // }

        System.out.println("This line goes in the GUI code.");
        handler.addListener(new InmatePhotoEventListener());

        System.out.println("Later, when you've received the response from "
                + "the web service...");
        InmateDataBean inmate = new InmateDataBean();
        inmate.setIntKey(23);
        handler.fireEvent(new InmatePhotoEventObject(handler), inmate);
    }
}

このクラスのメイン メソッドは、ListenerHandler の使用方法を示しています。クラスの残りのメソッドは標準です。独自の EventObject と EventListener を使用します。

于 2013-01-09T18:53:14.703 に答える
0

はい。

ActionEventとEventListenerListのJavaAPIドキュメントを参照することをお勧めします。

また、リスナー(オブザーバーとも呼ばれる)パターンについて読むことをお勧めします。

于 2013-01-09T18:19:09.927 に答える