web-dev-qa-db-ja.com

Javaでカスタムイベントを作成する

私はJavaでこのようなことをしたいのですが、方法がわかりません。

イベント「object 1 say 'hello'」が発生すると、object 2はそのイベントに「hello」と応答します。

誰かから私にヒントやサンプルコードをもらえますか。

181
conmadoi

おそらく オブザーバパターン を調べたいでしょう。

ここにあなた自身を始めるためのいくつかのサンプルコードがあります:

import Java.util.*;

// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
    void someoneSaidHello();
}

// Someone who says "Hello"
class Initiater {
    private List<HelloListener> listeners = new ArrayList<HelloListener>();

    public void addListener(HelloListener toAdd) {
        listeners.add(toAdd);
    }

    public void sayHello() {
        System.out.println("Hello!!");

        // Notify everybody that may be interested.
        for (HelloListener hl : listeners)
            hl.someoneSaidHello();
    }
}

// Someone interested in "Hello" events
class Responder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}

class Test {
    public static void main(String[] args) {
        Initiater initiater = new Initiater();
        Responder responder = new Responder();

        initiater.addListener(responder);

        initiater.sayHello();  // Prints "Hello!!!" and "Hello there..."
    }
}

関連記事: Java:カスタムイベントの作成

392
aioobe

あなたが欲しいのは observerパターン の実装です。完全に自分でやることも、Java.util.ObserverJava.util.ObservableのようなJavaクラスを使うこともできます。

27
Bozho

これを設定するには3つの方法があります。

  1. Throwerの内部Catcher
  2. Catcherの内部Thrower
  3. この例の別のクラス内のThrowerおよびCatcherTest

ワーキングGITHUBの例I CITINGデフォルトはオプション3で、他の人は単に "Optional "メインにしたいクラスのコードブロック、およびそのクラスを${Main-Class}ファイルのbuild.xml変数として設定します。

4サイドコードのスローに必要なもの:

import Java.util.*;//import of Java.util.event

//Declaration of the event's interface type, OR import of the interface,
//OR declared somewhere else in the package
interface ThrowListener {
    public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
    List<ThrowListener> listeners = new ArrayList<ThrowListener>();
    public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
    //Set of functions that Throw Events.
        public void Throw(){ for (ThrowListener hl : listeners) hl.Catch();
            System.out.println("Something thrown");
        }
////Optional: 2 things to send events to a class that is a member of the current class
. . . go to github link to see this code . . .
}

2クラスからイベントを受け取るためにクラスファイルで必要なもの

/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
    @Override public void Catch() {
        System.out.println("I caught something!!");
    }
////Optional: 2 things to receive events from a class that is a member of the current class
. . . go to github link to see this code . . .
}
21
GlassGhost

以下は全く同じではありませんが似ています、私はinterfaceメソッドへの呼び出しを追加するためのスニペットを探していましたが、この質問を見つけたので、私はそれを探している人のためにこのスニペットを追加することにしました

 public class MyClass
 {
        //... class code goes here

        public interface DataLoadFinishedListener {
            public void onDataLoadFinishedListener(int data_type);
        }

        private DataLoadFinishedListener m_lDataLoadFinished;

        public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
            this.m_lDataLoadFinished = dlf;
        }



        private void someOtherMethodOfMyClass()
        {
            m_lDataLoadFinished.onDataLoadFinishedListener(1);
        }    
    }

使い方は次のとおりです。

myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
            @Override
            public void onDataLoadFinishedListener(int data_type) {
                }
            });
1
Ivan