MyEventTestjava:
package wintysevent;
import javaxswingeventEventListenerList;
import javautilDate;
import javatextDateFormat;
import javatextSimpleDateFormat;
/**
* Java的事件机制/自定义事件
运行结果:
do something interesting in source here
listener detects [event]:wintyseventMyEvent[source=wintyseventMySource@
] [occur at]: ::
listener detects [event]:wintyseventMyEvent[source=wintyseventMySource@
] [occur at]: ::
* @version
* @author 天堂露珠 ()
* @see
*/
class MyEventTest{
public static void main(String[] args){
MySource source = new MySource();
MyListener myListener = new MyListener(){
public void doMyAction(MyEvent e){
Systemoutprintln(listener detects + e);
}
};
sourceaddMyListener(myListener);
sourceaddMyListener(myListener);
sourceaddMyListener(myListener);
sourceremoveMyListener(myListener);
sourcedoSomething();
}
}
/**
* 自定义的事件
* @version
* @author 天堂露珠()
* @see
*/
class MyEvent extends javautilEventObject{
private Date date;//记录事件发生的时间
public MyEvent(Object source Date date){
super(source);
thisdate = date;
}
public String toString(){
DateFormat df = new SimpleDateFormat(yyyyMMdd HH:mm:ss);
String dt = dfformat(date);
return [event]: + supertoString() + [occur at]: + dt;
}
}
/**
* 自定义事件监听器接口
* @version
* @author 天堂露珠()
* @see
*/
interface MyListener extends javautilEventListener{
void doMyAction(MyEvent e);
}
/**
* 自定义事件源
* @version
* @author 天堂露珠()
* @see
*/
class MySource{
/**
* 保存注册的监听器列表
* 子类可以使用它保存自己的事件监听器(非MyListener监听器)列表
*/
protected EventListenerList listenerList = new EventListenerList();
private MyEvent myEvent = null;//fireDoMyAction()使用此变量
/**
* 没有做任何事
*/
public MySource(){
}
/**
* 添加一个MyListener监听器
*/
public void addMyListener(MyListener listener){
listenerListadd(MyListenerclass listener);
}
/**
* 移除一个已注册的MyListener监听器
* 如果监听器列表中已有相同的监听器listenerlistener
* 并且listener==listener
* 那么只移除最近注册的一个监听器
*/
public void removeMyListener(MyListener listener){
listenerListremove(MyListenerclass listener);
}
/**
* @return 在此对象上监听的所有MyListener类型的监听器
*/
public MyListener[] getMyListeners(){
return (MyListener[])listenerListgetListeners(MyListenerclass);
}
//Winty:Copy directly from javaxswingeventEventListenerList
/*Notify all listeners that have registered interest for
notification on this event type The event instance
is lazily created using the parameters passed into
the fire method
*/
protected void fireDoMyAction() {
// getListenerList() Guaranteed to return a nonnull array
Object[] listeners = listenerListgetListenerList();
// Process the listeners last to first notifying
// those that are interested in this event
for (int i = listenerslength; i>=; i=) {
if (listeners[i]==MyListenerclass) {
// Lazily create the event:
if (myEvent == null)
myEvent = new MyEvent(this new Date());
((MyListener)listeners[i+])doMyAction(myEvent);
}
}
}
/**
* 做一些事件源应该做的有意义的事然后通知监听器
* 这里只是一个示例方法
* 例如:MySource如果是一个按钮则doSomething()就可以命名为click()
* 当用户点击按钮时调用click()方法
*/
public void doSomething() {
Systemoutprintln(do something interesting here);
fireDoMyAction();//通知监听器
}
}
EventListenerList是特别需要说明的它内部使用一个Object数组存放监听器但是它并不是直接存放而是先存监听器的class类型然后再存监听器本身即存放(MyListenerclass myListener)一个Object数组可以存放多种类型的Listener如果还有一种监听器AnotherListener那么(AnotherListenerclass anotherListener)也可以存放无论增删都是两个对象一同被添加或删除上述代码中的listenerListadd(MyListenerclass listener)或listenerListremove(MyListenerclass listener)以及fireDoMyAction()中的i=就是这样操作的