2011-12-27 14 views
1

カスタムイベントをあるオブジェクトから別のオブジェクトに送信するにはどうすればよいですか?
私は同じタイプの2つの作業オブジェクトを持っています、メインクラスは作業者を使用します。 worker1で何らかの条件が満たされている場合は、ワーカーを切り替えるメインクラスにイベントを送信する必要があります。カスタムイベントの作成と送信

これは私のシナリオです:

class Worker1 extends Base{ 
    public void DoSomeWork(Arg argument){ 
     if(someCondition=true){ 
      SendEvent(); 
     } 
    } 
} 

class MainClassThatUsesWorker{ 
    Base worker = new Worker1(); 

    public void EventArrived(){ 
     worker = new Worker2();  
    } 

    public void UseWorKer(){ 
     worker.DoSomeWork();  
    } 
} 

答えて

2

私はあなたがobserver patternを実装示唆しています。あなたのメインクラスはオブザーバーであり、ワーカーは観察可能な(またはサブジェクト)です。作業者が適切なイベントを発生させると、メインクラスがそれを適切に処理します。複数のスレッドを扱うため、同期に注意してください。

0

まず、Javaの命名規則を尊重してください。メソッドは小文字で始まる必要があります。

あなたが主な目的は、何かが労働者に発生したときに通知を受けたい場合は、労働者が主要オブジェクトへの参照持っている必要があります:あなたはまた、ちょうどそのリスナーの他の種類を受け入れることをお勧めします

public void doSomeWork(MainClassThatUsesWorker main) { 
    if (someCondition) { 
     main.eventArrived(); 
    } 
} 

MainClassThatUsesWorker。この場合、WorkerListenerのインタフェースはeventArrivedのメソッドを宣言し、WorkerListenerを引数にとります。 MainClassThatUsesWorkerは、このインターフェイスを実装してワーカーによってトリガされたイベントをリッスンする必要がありますが、他のクラスも同じインターフェイスを実装して引数として渡すことができます。

2

スイングなどの操作方法を見てください。基本的には、メインクラス(または他のハンドラ)によって実装されるイベントクラスとリスナインタフェースを定義します。次に、イベントを送信者に登録します。つまり、それらをいくつかのコレクションに入れます。イベントが発生すると、そのコレクションを反復処理し、リスナーの処理メソッドを呼び出します。

(簡体字)、このような何か:

class MyEvent { ... }; 

interface MyListener { 
    void handleEvent(MyEvent e); 
} 

//inside the worker class 
public void SendEvent() { 
    MyEvent e = new MyEvent(); 
    for(MyListener l : listeners) { 
    l.handleEvent(e); 
    } 
} 
関連する問題