Создание собственных событий
При разработке приложений часто бывает нужно реализовать обработку неких событий. В Java cтандарным способ создания модели обработки событий, является метод описаный в спецификации JavaBeans.
Создадим собственный класс описывающий событие My. Обычно его наследуют от EventObject, а имя ИмяСобытияEvent.
Код | public class MyEvent extends EventObject { private static final long serialVersionUID = -6326247162271636387L; private String message;
public MyEvent(Object source, String message) { super(source); this.message = message; }
public MyEvent(Object source) { this(source, ""); }
public MyEvent(String message) { this(null, message); }
public MyEvent() { this(null, ""); }
public String getMessage() { return message; }
@Override public String toString() { return getClass().getName() + "[source = " + getSource() + ", message = " + message + "]"; } } |
Создадим интерфейс слушателя. Тот кто желает получать уведомления о событиях, должен будет реализовать этот интерфейс. Имя интерфейса ИмяСобытияListener.
Код | public interface MyListener { public void myWillHappend(MyEvent myEvent);
public void myHappend(MyEvent myEvent); } |
в данном случае мы описали два метода, первый будет вызываться до того как событие My произойдет, второй после.
Теперь опишем класс который будет выполнять некую работу и оповещать всех заинтересованных слушателей. Класс должен содержать методы: addИмяСобытияListener, getИмяСобытияListeners и removeИмяСобытияListener. Так же обычно создают вспомогательные методы fireXXX, для того чтобы было удобней оповещать слушателей.
Код | public class MyEventProducer { private ArrayList<MyListener> listeners = new ArrayList<MyListener>();
public void addMyListener(MyListener listener) { listeners.add(listener); }
public MyListener[] getMyListeners() { return listeners.toArray(new MyListener[listeners.size()]); } public void removeMyListener(MyListener listener) { listeners.remove(listener); } protected void fireMyWillHappend(String message) { MyEvent ev = new MyEvent(this, message); for(MyListener listener : listeners) listener.myWillHappend(ev); } protected void fireMyHappend(String message) { MyEvent ev = new MyEvent(this, message); for(MyListener listener : listeners) listener.myHappend(ev); } public void doWork(String workName) { fireMyWillHappend("begin work " + workName); try { Thread.sleep(1000); } catch(InterruptedException e) { } fireMyHappend("end work" + workName); } } |
А теперь проверим как это все вместе работает:
Код | public static void main(String[] args) { MyEventProducer eventProducer = new MyEventProducer(); eventProducer.addMyListener(new MyListener() { public void myHappend(MyEvent myEvent) { System.out.println("myHappend() " + myEvent.getMessage()); }
public void myWillHappend(MyEvent myEvent) { System.out.println("myWillHappend() " + myEvent.getMessage()); } }); eventProducer.doWork("my-job"); } |
|