Generowanie (własnych) zdarzeń dziedziczących po EventObject – sposób 2
Sytuacja przedstawiona w poprzednim wpisie komplikuje się nieco, gdy musimy generować więcej niż jedno zdarzenie.
Klasa SmokEvent
jest taka jak poprzednio. Dodatkowo generujemy klasę SmokEvent1
.
Klasa SmokEvent1
package events4; import java.util.*; class SmokEvent1 extends EventObject { private static final long serialVersionUID = 4133048828738474610L; public SmokEvent1(Smok source) { super(source); } }
Od klasy SmokEvent
różni się jedynie nazwą.
Klasa SmokListener
wygląda nieco inaczej.>/
Klasa SmokListener
package events4; import java.util.*; interface SmokListener extends EventListener { void smokZasnal(SmokEvent e); void smokObudzilSie(SmokEvent1 e); }
Klasa Smok
nieco różni się od poprzedniej.
Klasa Smok
package events4; import java.util.*; class Smok { private static final long serialVersionUID = 5496971741095724065L; private final Vector<SmokListener> listeners = new Vector<>(); public Smok() { } @SuppressWarnings("unchecked") public void uspijSmoka() { Vector<SmokListener> v = (Vector<SmokListener>) listeners.clone(); SmokEvent event = new SmokEvent(this); Enumeration<SmokListener> e = v.elements(); while (e.hasMoreElements()) (e.nextElement()).smokZasnal(event); } @SuppressWarnings("unchecked") public void obudzSmoka() { Vector<SmokListener> v = (Vector<SmokListener>) listeners.clone(); SmokEvent1 event1 = new SmokEvent1(this); Enumeration<SmokListener> e = v.elements(); while (e.hasMoreElements()) (e.nextElement()).smokObudzilSie(event1); } public synchronized void addSmokListener(SmokListener d) { listeners.addElement(d); } public synchronized void removeSmokListener(SmokListener d) { listeners.removeElement(d); } }
Różnica polega na tym, że każda z metod obudzSmoka()
i uspijSmoka()
generuje inne zdarzenie i wywołuje inna metodę listenera.
Klasa Main
jest identyczna i generuje identyczne wyniki jak klasa Main
w poprzednim wpisie.
Smok zasnął Smok obudził się