Waarom maar 1 actionListener. Het zou imho generieker zijn als er meer events aangenomen zouden kunnen worden.
Denk bijvoorbeeld aan grafiekdata die kan veranderen, waaraan je meerdere grafiekweergaves kan hangen, die elk gewaarschuwd moeten worden bij het updaten.
Daarom hier wat aangepaste code van je, om zo het Observer pattern weer te geven.
Java:
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
| public interface ActionObserverable {
public void addActionListener( ActionListener al );
public void removeActionListener( ActionListener al );
public void notifyAllListeners( ActionEvent event );
}
public class Test implements ActionObserverable{
List _listeners = new ArrayList()
/**
* Waarom een lege default constructor?
* Die genereert de compiler wel voor je hoor ;)
*/
public Test() {
}
/**
* Add an actionListener as registered listener from this class
* This listener will be notifyed if an action occures
*/
public void addActionListener( ActionListener al ){
if( al == null )
throw new NullPointerException( "The listener cannot be null" );
_listeners.add( al );
}
/**
* Remove an actionListener as registered listener from this class
* This listener will be not be notifyed anymore if an action occures
*/
public void removeActionListener( ActionListener al ){
if( al == null )
throw new NullPointerException( "The listener cannot be null" );
_listeners.remove( al );
}
public void notifyAllListeners( ActionEvent event ) {
for( Iterator iter = _listeners.iterator(); iter.hasNext(); ) {
ActionListener listener = (ActionListener) iter.next();
listener.actionPerformed( event );
}
}
public void testEventDispatch(){
ActionEvent ae = new ActionEvent( this, ActionEvent.ACTION_PERFORMED, "TEST" );
notifyAllListeners( ae );
}
} |
Nou voldoet jou Eventtossende class aan een interface, nl. het is nu bekend dat hij een Observerable is ( een class de in de gaten wordt gehouden zeg maar ) Natuurlijk kun je iets andere keuzes maken (bijv
notifyAllListeners niet public, en de
List _listeners,
addActionListener() en
removeActionListener in een abstracte class te zetten, maar het idee is hopelijk duidelijk