如果您要查找.NET类型的委托事件,我建议使用此模板化解决方案。
它的优点是不需要硬类型转换,并且只要侦听器使用不同的事件类,就可以实现几个“事件”。
import java.util.EventListener;
import java.util.EventObject;
// replaces the .net delegate
public interface GenericEventListener
extends EventListener {
public void eventFired(EventArgsType e);
}
//------------------------------------------------
import java.util.EventObject;
import java.util.Vector;
// replaces the .net Event keyword
public class GenericEventSource {
private Vector> listenerList =
new Vector>();
//TODO handle multi-threading lock issues
public void addListener(GenericEventListener listener) {
listenerList.add(listener);
}
//TODO handle multi-threading lock issues
public void raise(EventArgsType e) {
for (GenericEventListener 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 {
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 myEvent = new GenericEventSource();
public GenericEventSource 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));