4

Javaでは、新しいカスタムイベントを作成するたびに、通常、次の3つのメソッドを追加して作成します。

addDogEventListener(EventListener listener); 
removeDogEventListener(EventListener listener);
dispatchDogEventListener(DogEvent event);

次に、別のイベント、たとえばCatEventをディスパッチする場合は、次の3つのメソッドすべてを再度作成する必要があります。

addCatEventListener(EventListener listener); 
removeCatEventListener(EventListener listener);
dispatchCatEventListener(CatEvent event);

次に、1種類のCa​​tEventイベントだけを管理したい場合、たとえばMeowの場合、これら3つのメソッドすべてをもう一度コピーして貼り付ける必要がありますか?!addCatMeowEventListener(); ...などのように?

そして通常、私は複数の種類のイベントをディスパッチする必要があります。イベントを送信および処理するための非常に多くのメソッドでクラス全体を埋めるのは非常に乱雑です。それだけでなく、これらの関数には、EventListenerListのループ、リストへのイベントの追加など、非常によく似たコードがあります。

これは、Javaでイベントディスパッチを実行する方法ですか?

私がそれを次のように行うことができるような方法はありますか?

mainApp.addEventListener(CatEvent.MEOW, new EventHandler() { meowHandler(Event e) { });
mainApp.addEventListener(CatEvent.EAT, new EventHandler() { eatHandler(Event e) { });
myCat.addEventListener(DogEvent.BARK, new EventHandler() { barkHandler(Event e) { myCat.run() });

このようにして、さまざまなeventHandlerクラスおよび関数でさまざまなタイプのCatEventを処理でき、さまざまなイベントに対してさまざまなイベントリスナーメソッドを作成し続ける必要はありませんか?

Javaのイベント処理について何かが足りないかもしれませんが、3つのメソッドをコピーして貼り付ける必要がなく、ディスパッチするさまざまな種類のメソッドごとに非常に多くの種類のイベントオブジェクトを作成する必要がないという優れた方法はありますか?

ありがとう!

4

2 に答える 2

4

私が持っているイベント処理戦略は、あなたに合ったタイプ別に公開することです。

メソッドをイベントのリッスンとしてマークするアノテーションについてリスナーを調べることができるブローカーがあります。このアプローチを使用すると、特定のクラスのイベントを処理する場合にのみメソッドを追加する必要があります。

interface Subscriber { // marker interface for OSGi
}

@interface SubscriberCallback { // marker annotation
}

class Broker {
    // uses reflections to find methods marked with @SubscriberCallback
    public void addSubscriber(Subscriber subscriber); 
    public void removeSubscriber(Subscriber subscriber);
    public <T> void publish(T... events);
}

class MyListener implements Subscriber {

@SubscriberCallback
public void onDogEvent(DogEvent... dogEvents) {
    // called for one or more dog events
}

@SubscriberCallback
public void onCatEvent(CatEvent catEvent) {
    // called for each CatEvent including subsclass of CatEvent.
}
}
于 2011-05-28T08:43:09.550 に答える
0

次に、1種類のCa​​tEventイベントだけを管理したい場合は、Meow(およびEAT)と言います。

イベント(MEOWまたはEAT)の「アクション」は、CatEventで定義されたデータである必要があります。次に、イベントリスニングコードがアクションタイプをチェックし、適切な処理を実行します。

TableModelEventを見て、これがどのように行われるかを確認してください。同じイベントを使用して、「挿入」、「削除」、および「更新」イベントを処理します。

また、PropertyChangeListenerに基づいて一般的なイベントリスナーをモデル化することもできます。PropertyChangeListenerは、Swingコンポーネントでさまざまなプロパティが変更されたときのイベントを処理するために使用されます。たとえば、setForeground()、setBackground()、setFont()、setText()、setIconを呼び出す場合です。PropertyChangeListenerは、getName()メソッドを使用して、変更されたプロパティを判別します。したがって、上記のメソッドの場合、名前は「foreground」、「background」、「font」、「text」、「icon」になります。これがどのように機能するかの例については、プロパティ変更リスナーの使用方法を参照してください。

あなたの場合、名前は「猫」と「犬」になります。このアプローチは、作成するGeneralEventに、各イベントに関連する情報(つまり、「meow」と「bark」)を含めることができる場合にのみ機能します。

于 2011-05-28T15:21:20.600 に答える