I like the EventDispatcher class from ActionScript 3 so I decided to write one for Java.
Usage
1 2 3 4 5 6 7 | foo.addEventListener("MyEvent", new EventListener() { public void run(Event event) { // remove the listener if no longer needed event.target.removeEventlistener(event.type, this); // do stuff } } |
Now your class can either extend EventDispatcherImp or implement EventDispatcher and you’re ready to dispatch events.
Via inheritance
1 2 3 | import com.wumedia.events.EventDispatcher.EventDispatcherImpl; public class Dispatcher extends EventDispatcherImpl { } |
Via composition
1 2 3 4 5 6 | import com.wumedia.events.EventDispatcher.EventDispatcherImpl; public class Dispatcher implements EventDispatcher { public Dispatcher() { _dispatcher = new EventDispatcherImpl(this); } } |
Here are the 3 required classes,
The Event
1 2 3 4 5 6 7 8 | package com.wumedia.events; public class Event { public String type; public EventDispatcher target; public Event(String type) { this.type = type; } } |
The Listener
1 2 3 4 | package com.wumedia.events; public abstract interface EventListener { public void run(Event event); } |
The Dispatcher
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | package com.wumedia.events; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; public interface EventDispatcher { /** * Register an event listener * @param type String the name of the event to listen to * @param listener EventListener the listener */ public void addEventListener(String type, EventListener listener); /** * Unregister an event listener * @param type String the name of the event registered to * @param listener EventListener the listener */ public void removeEventlistener(String type, EventListener listener); /** * Remomve all listeners */ public void removeAllListeners(); /** * Dispatch an Event * @param event Event */ public void dispatchEvent(Event event) ; /** * Query to see if there are any listeners registered to a certain event name * @param type String the event name to query * @return boolean */ public boolean willTrigger(String type); public class EventDispatcherImpl implements EventDispatcher { protected HashMap<string , ArrayList<EventListener>> _listenersMap; protected EventDispatcher _eventTarget; /** * Constructor - intended for inheritance */ public EventDispatcherImpl() { removeAllListeners(); } /** * Constructor - intended for composition * @param eventTarget EventListener to use as the event target in the Event sent */ public EventDispatcherImpl(EventDispatcher eventTarget) { _eventTarget = eventTarget; } public void addEventListener(String type, EventListener listener) { removeEventlistener(type, listener); ArrayList<eventlistener> listeners = _listenersMap.get(type); if ( listeners == null ) { listeners = new ArrayList</eventlistener><eventlistener>(); _listenersMap.put(type, listeners); } listeners.add(listener); } public void removeEventlistener(String type, EventListener listener) { ArrayList</eventlistener><eventlistener> listeners = (ArrayList</eventlistener><eventlistener>) _listenersMap.get(type); if ( listeners != null ) { Iterator</eventlistener><eventlistener> items = listeners.iterator(); while( items.hasNext() ) { if ( (EventListener) items.next() == listener ) { items.remove(); return; } } if ( listeners.isEmpty() ) { _listenersMap.remove(type); } } } public void removeAllListeners() { _listenersMap = new HashMap<string , ArrayList<EventListener>>(); } public void dispatchEvent(Event event) { ArrayList<eventlistener> listeners = (ArrayList</eventlistener><eventlistener>) _listenersMap.get(event.type); if ( listeners != null ) { event.target = _eventTarget != null ? _eventTarget : this; Iterator</eventlistener><eventlistener> items = listeners.iterator(); while( items.hasNext() ) { ( (EventListener) items.next() ).run(event); } } } public boolean willTrigger(String type) { ArrayList</eventlistener><eventlistener> listeners = (ArrayList</eventlistener><eventlistener>) _listenersMap.get(type); return listeners == null || listeners.isEmpty(); } } } </eventlistener></string></eventlistener></string> |
this is way cool. very impresssed.
nice.
really nice work!!
i always wanted this, definitely use these classes for my next project.
thanks!