Java、LotusScript和JavaScript中的自定义事件编程(二)

2014-11-24 02:01:34 · 作者: · 浏览: 6
ntArg ea); } package starrow.util; import java.util.ArrayList; import java.util.Collection; import java.util.Hashtable; /** * This class contains the methods needed for adding, removing event listeners, * and firing a custom event. */ public class EventPublisher { //Use a hashtable to hold the collections of event listeners, which does not permit null values. Hashtable > eventMap =new Hashtable >(); public void addEventListener(String eventName, IEventListener listener){ // Collection eventCollection; // if (eventMap.containsKey(eventName)){ // eventCollection=eventMap.get(eventName); // }else{ // eventCollection=new ArrayList (); // eventMap.put(eventName, eventCollection); // } Collection listeners=eventMap.get(eventName); if (listeners==null){ listeners=new ArrayList (); eventMap.put(eventName, listeners); } listeners.add(listener); } public void removeEventListener(String eventName, IEventListener listener){ Collection listeners=eventMap.get(eventName); if (listeners!=null){ listeners.remove(listener); } } //Fires an event with the provided name and EventArg object. protected void fireEvent(String eventName, EventArg ea){ Collection listeners=eventMap.get(eventName); if (listeners!=null){ for (IEventListener listener : listeners){ try{ listener.handleEvent(ea); }catch (Exception e){ e.printStackTrace(); } } } } //Fires an event with the provided name and a default EventArg object. protected void fireEvent(String eventName){ this.fireEvent(eventName, new EventArg(this)); } }

我们来看看上述自定义事件框架的一个测试。给一个发布者定义两个事件MyEvent1和MyEvent2,并分别给它们登记一个和两个收听者。

package starrow.test;

import starrow.util.EventArg;
import starrow.util.EventPublisher;

public class MyEventPublisher extends EventPublisher{

	public void run(){
		System.out.println("A MyEventPublisher publisher1 is running.");
		System.out.println("Publisher1 fires MyEvent1.");
		this.fireEvent("MyEvent1");
		System.out.println("Publisher1 fires MyEvent2.");
		EventArg ea=new EventArg(this);
		ea.put("name", "MyEvent2").put("x", 10).put("y", 30);
		this.fireEvent("MyEvent2",ea);
	}
}

package starrow.test;

import starrow.util.*;

public class MyEvent1Listener1 implements IEventListener{

	@Override
	public void handleEvent(EventArg ea) {
		System.out.println("MyEvent1 handled in MyEvent1Listener1.");
	}

	
}

package starrow.test;

import starrow.util.*;

public class MyEvent2Listener1 implements IEventListener{

	@Override
	public void handleEvent(EventArg ea) {
		System.out.println("MyEvent2 handled in MyEvent2Listener1.");
	}

}

package starrow.test;
import starrow.util.*;
import starrow.util.IEventListener;
import java.util.Map.Entry;

public class MyEvent2Listener2 implements IEventListener{

	@Override
	public void handleEvent(EventArg ea) {
		System.out.println("MyEvent2 handled in MyEvent2Listener2. Event information: ");
		for (Entry
  
    entry : ea.getInfo().entrySet()){
			System.out.println(entry.getKey() + ": " + entry.getValue());
		}
	}

}

package starrow.test;

import starrow.util.*;

public class MyEventTester {
	
	public static void main(String[] args){
		MyEventPublisher publisher=new MyEventPublisher();
		IEventListener listener1=new MyEvent1Listener1();
		publisher.addEventListener("MyEvent1", liste