2009-07-30 14 views
6

カスタムイベントを発生させてJavaで処理する方法。いくつかのリンクが役立ちます。Javaでのイベント発生処理

ありがとうございました。

+0

あなたはあなたが何をしているのか少し詳しく説明してください。どのような出来事ですか? Javaには本質的なイベントはありませんが、おそらく例外はあなたの後にありますか? – falstro

+0

AWTイベントを意味しますか? –

+0

このように http://www.codeproject.com/KB/cs/csevents01.aspx – bdhar

答えて

3

Javaには、C#などの代理人やイベントの組み込みサポートが組み込まれていません。自分でObserverまたはPublish/Subscribeパターンを実装する必要があります。

0

Javaには、イベント処理の言語サポートがありません。しかし、いくつかのクラスがあります。 java.awt.Eventクラスをご覧ください。 java.awt.eventおよびjava.beansパッケージ。最初のパッケージは、AWTおよびSwing GUIライブラリのイベント処理の基盤です。 java.beansパッケージには、プロパティ変更イベントとBeanコンテキストイベントを含むJava Beans specificationのサポートスタッフが含まれています。

一般に、イベント処理は、観察者に応じて実装される、または(kgiannakakisにより述べたように)パターンをパブリッシュ/サブスクライブ

15

ジャワにはファーストクラスのイベントはありません。すべてのイベント処理は、インターフェースとリスナー・パターンを使用して行われます。たとえば:

// Roughly analogous to .NET EventArgs 
class ClickEvent extends EventObject { 
    public ClickEvent(Object source) { 
    super(source); 
    } 
} 

// Roughly analogous to .NET delegate 
interface ClickListener extends EventListener { 
    void clicked(ClickEvent e); 
} 

class Button { 
    // Two methods and field roughly analogous to .NET event with explicit add and remove accessors 
    // Listener list is typically reused between several events 

    private EventListenerList listenerList = new EventListenerList(); 

    void addClickListener(ClickListener l) { 
    clickListenerList.add(ClickListener.class, l) 
    } 

    void removeClickListener(ClickListener l) { 
    clickListenerList.remove(ClickListener.class, l) 
    } 

    // Roughly analogous to .net OnEvent protected virtual method pattern - 
    // call this method to raise the event 
    protected void fireClicked(ClickEvent e) { 
    ClickListener[] ls = listenerList.getListeners(ClickEvent.class); 
    for (ClickListener l : ls) { 
     l.clicked(e); 
    } 
    } 
} 

クライアントコードは、通常のハンドラを登録する匿名内部クラスを使用しています。

Button b = new Button(); 
b.addClickListener(new ClickListener() { 
    public void clicked(ClickEvent e) { 
    // handle event 
    } 
}); 
+0

ありがとう!しかし、コード内のClickEventを上げるには? - – bdhar

+1

'fireClicked'メソッドを呼び出してください。 –

+0

私はそれを取るEventListenerListはあなたのリスナークラスに型付けされたArrayListですか? – cjk

5

Javaが固有のイベント処理を欠いていますが、これを実現するのに役立つライブラリがあります。 javaEventingをチェックしてください。http://code.google.com/p/javaeventing/ これはC#のように最初にイベントを定義し、イベントリスナーを登録するのと同じように動作します。 EventManager.triggerEvent(.. someEvent)を使用してイベントをトリガーします。また、カスタム条件とペイロードにイベントを提供することもできます。

ボブ

+0

これはいいです、ありがとう:) – bdhar

+0

urlはもう機能しません。 – gdbj

2

あなたは.NET型のデリゲートイベントを探しているなら、私はこのテンプレートソリューションを提案しています。 ハードキャストは不要であり、リスナーは異なるイベントクラスを使用している限り、複数の「イベント」を実装できます。

import java.util.EventListener; 
import java.util.EventObject; 
// replaces the .net delegate 

public interface GenericEventListener<EventArgsType extends EventObject> 
    extends EventListener { 
    public void eventFired(EventArgsType e); 
} 

//------------------------------------------------ 

import java.util.EventObject; 
import java.util.Vector; 
// replaces the .net Event keyword 

public class GenericEventSource<EventArgsType extends EventObject> { 
    private Vector<GenericEventListener<EventArgsType>> listenerList = 
     new Vector<GenericEventListener<EventArgsType>>(); 

    //TODO handle multi-threading lock issues 
    public void addListener(GenericEventListener<EventArgsType> listener) { 
     listenerList.add(listener); 
    } 

    //TODO handle multi-threading lock issues 
    public void raise(EventArgsType e) { 
     for (GenericEventListener<EventArgsType> listener : listenerList) { 
      listener.eventFired(e); 
     } 
    } 
} 

//------------------------------------------------ 

// like a .net class extending EventArgs 
public class MyCustomEventArgs extends EventObject { 
    private int arg; 
    public MyCustomEventArgs(Object source, int arg) { 
     super(source); 
     this.arg = arg; 
    } 
    public int getArg() { 
     return arg; 
    } 
} 

//------------------------------------------------ 

// replaces the .net event handler function. Can be put in a nested class, Java style 
// Listener can handle several event types if they have different EventArg classes 
public class MyCustomListener implements GenericEventListener<MyCustomEventArgs> { 
    private Object source = null; 
    private int arg; 
    public void eventFired(MyCustomEventArgs e) { 
     source = e.getSource(); 
     arg = e.getArg(); 
     // continue handling event... 
    } 
} 

//------------------------------------------------ 

import GenericEventListener; 
import GenericEventSource; 
// this is the class that would like to throw events (e.g. MyButton) 
public class MyCustomEventSource { 
    // This is like declaring a .net public Event field of a specific delegate type 
    GenericEventSource<MyCustomEventArgs> myEvent = new GenericEventSource<MyCustomEventArgs>(); 

    public GenericEventSource<MyCustomEventArgs> getEvent() { 
     return myEvent; 
    } 
} 

//------------------------------------------------ 

// Examples of using the event 
MyCustomListener myListener1 = new MyCustomListener(); 
MyCustomEventSource mySource = new MyCustomEventSource(); 
mySource.getEvent().addListener(myListener1); 
mySource.getEvent().raise(new MyCustomEventArgs(mySource,5));