Упрощенная обработка пользовательских событий в Java - PullRequest
4 голосов
/ 28 мая 2011

В Java каждый раз, когда я хочу создать новое пользовательское событие, я обычно делаю это, добавляя 3 метода, а именно:

addDogEventListener(EventListener listener); 
removeDogEventListener(EventListener listener);
dispatchDogEventListener(DogEvent event);

Затем, если я хочу отправить другое событие, скажем CatEvent, я будунужно снова создать все эти 3 метода:

addCatEventListener(EventListener listener); 
removeCatEventListener(EventListener listener);
dispatchCatEventListener(CatEvent event);

Тогда, если я хочу управлять только одним видом события CatEvent, скажем Мяу, мне придется скопировать и вставить все эти 3 метода снова ?!Как addCatMeowEventListener (); ... и т. Д.

И обычно мне нужно отправлять более одного вида событий.Будет очень неопрятно, чтобы весь класс был заполнен таким количеством методов, чтобы передавать и обрабатывать события.Мало того, что эти функции имеют очень похожий код, такой как цикл по EventListenerList, добавление события в список и т. Д.

Это то, как я должен делать диспетчеризацию событий в Java?

Есть литаким образом, я могу сделать это следующим образом:

mainApp.addEventListener(CatEvent.MEOW, new EventHandler() { meowHandler(Event e) { });
mainApp.addEventListener(CatEvent.EAT, new EventHandler() { eatHandler(Event e) { });
myCat.addEventListener(DogEvent.BARK, new EventHandler() { barkHandler(Event e) { myCat.run() });

Таким образом, я могу просто обрабатывать различные типы CatEvent в разных классах и функциях eventHandler, и мне не нужно продолжать создавать разные методы прослушивателя событийдля различных событий?

Может быть, я что-то упускаю из-за обработки событий в Java, но есть ли более удобный способ, чтобы мне не нужно было копировать и вставлять 3 метода, плюс создавать так много различных типов объектов событий длявсе виды методов, которые я хочу отправить?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 мая 2011

Стратегия обработки событий, которую я имею, заключается в публикации по типу, который вам подходит.

У меня есть брокер, который может проверить слушателя на наличие аннотации, которая помечает метод как прослушивание событий. При использовании этого подхода вам нужно добавлять методы только тогда, когда вы хотите обработать определенный класс событий.

interface Subscriber { // marker interface for OSGi
}

@interface SubscriberCallback { // marker annotation
}

class Broker {
    // uses reflections to find methods marked with @SubscriberCallback
    public void addSubscriber(Subscriber subscriber); 
    public void removeSubscriber(Subscriber subscriber);
    public <T> void publish(T... events);
}

class MyListener implements Subscriber {

@SubscriberCallback
public void onDogEvent(DogEvent... dogEvents) {
    // called for one or more dog events
}

@SubscriberCallback
public void onCatEvent(CatEvent catEvent) {
    // called for each CatEvent including subsclass of CatEvent.
}
}
0 голосов
/ 28 мая 2011

Тогда, если я хочу управлять только одним видом события CatEvent, скажем, Мяу (и EAT)

«Действие» события (MEOW или EAT) должно быть данными, определенными в CatEvent. Затем ваш код прослушивания событий проверит тип действия и выполнит соответствующую обработку.

Может быть, посмотрите на TableModelEvent, чтобы увидеть, как это делается. Он обрабатывает события «вставка», «удаление» и «обновление», используя одно и то же событие.

Также вы можете, вероятно, смоделировать общий приемник событий на основе PropertyChangeListener. PropertyChangeListener используется для обработки событий, когда различные свойства изменяются в компоненте Swing. Например, когда вы вызываете setForeground () или setBackground () или setFont () или setText () или setIcon. PropertyChangeListener использует метод getName (), чтобы определить, какое свойство было изменено. Таким образом, для вышеупомянутых методов имена будут "передний план", "фон", "шрифт", "текст", "значок". См. Как использовать прослушиватели изменений свойств для примера того, как это может работать.

В вашем случае имена будут "кошка" и "собака". Этот подход будет работать только в том случае, если созданное вами GeneralEvent может содержать информацию, относящуюся к каждому из ваших событий (например, «мяу» и «лай»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...