事件 監聽 機制的自實現 (event listener)
北天JAVA技術網(www.java114.com))Notifier notifier = new Notifier("actionPerformed");
...notifier.addListener( someObject );
...notifier.notify( new ActionEvent(this) );只要幾行代碼就能夠完成一切。
下面的Notifier類就達到了這個目的:
package com.generationjava.lang;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.Iterator;
public class Notifier {
private ArrayList listeners = new ArrayList();
private String listenerMethod;
public Notifier(String name) {
this.listenerMethod = name;
}
public void addListener(Object not) {
this.listeners.add(not);
}
public void removeListener(Object not) {
this.listeners.remove(not);
}
public void notify(EventObject event) {
Iterator itr = listeners.iterator();
while(itr.hasNext()) {
try {
Object listener = itr.next();
Class clss = listener.getClass();
Method method = clss.getMethod(this.listenerMethod,new Class[] { event.getClass() });
method.invoke( listener, new Object[] { event } );
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
以下內容摘自CSDC社區: (http://topic.csdn.net/t/20020918/10/1032825.html)
其實java的事件機制十分簡單,你完全可以實現自己的事件驅動;
主要涉及到如下幾個類(可以參考鍵盤事件的有關類):
1.事件類XXXEvent,其中包含你所規定的事件的一些信息,如事件源,事件名稱等等,如KeyEvent,中有eventSource,keyCode等等
2.事件監聽接口,XXXEventListener,其中包含捕獲到事件的類要作的事情,如KeyListener,其中包括:keyPress,keyReleased,等等
如:
public interface XXXListener{
public void doXXXEvent(xxxEvent e);
}
3.發出事件的類:可以是任意的類,在這個類中,可以發出該事件XXXEvent,比如可以在這個類中添加一個fireXXXEvent方法,在這個方法中去手工發出事件,如:
public void fireXXXEvent(){
java.util.Vector targets;
synchronized (this) {
targets = (java.util.Vector) xxxListeners.clone();
}
XXXEvent evt = new XXXEvent(.....);
for (int i = 0; i < targets.size(); i++) {
XXXListener target = (XXXListener) targets.elementAt(i);
target.doXXXEvent(evt);
}
}
此外在這個類里要有一個監聽列表即上面的xxxlisteners,在這個類中還要實現一個addXXXListrener(XXXListener)方法,來把一個實現了XXXListenr的類作為監聽者加到該類中。