在Java中,每次我想创建一个新的自定义事件时,我通常会添加3个方法:
addDogEventListener(EventListener listener);
removeDogEventListener(EventListener listener);
dispatchDogEventListener(DogEvent event);
然后现在如果我要发送另一个事件,比如CatEvent,我将不得不再次创建所有这三个方法:
addCatEventListener(EventListener listener);
removeCatEventListener(EventListener listener);
dispatchCatEventListener(CatEvent event);
然后,如果我想管理一种CatEvent事件,请说Meow,我必须再次复制并粘贴所有这三种方法?!像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() });
通过这种方式,我可以在不同的eventHandler类和函数中处理不同类型的CatEvent,而且我不必为不同的事件继续创建不同的事件监听器方法?
也许我错过了关于Java事件处理的一些内容,但有一种更简洁的方法,我不必复制和粘贴3种方法,另外为我想要的每种不同类型的方法创建许多不同类型的事件对象派遣?
谢谢!
答案 0 :(得分:4)
我所拥有的事件处理策略是按类型发布,可能适合您。
我有一个代理可以检查监听器的注释,该注释将方法标记为侦听事件。使用此方法时,只需要在处理特定类别的事件时添加方法。
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.
}
}
答案 1 :(得分:0)
然后,如果我想管理一种CatEvent事件,请说Meow,(和EAT)
事件的“动作”(MEOW或EAT)应该是CatEvent中定义的数据。然后,您的事件监听代码将检查操作类型并执行适当的处理。
也许看一下TableModelEvent来看看它是如何完成的。它使用相同的事件处理“插入”,“删除”和“更新”事件。
你也可以根据PropertyChangeListener建模一般事件监听器。 PropertyChangeListener用于处理Swing组件上各种属性更改时的事件。例如,当您调用setForeground()或setBackground()或setFont()或setText()或setIcon时。 PropertyChangeListener使用getName()方法来确定已更改的属性。因此,对于上述方法,名称将是“前景”,“背景”,“字体”,“文本”,“图标”。有关这可能如何起作用的示例,请参阅How to Use Property Changes Listeners。
在你的情况下,名字将是“猫”和“狗”。只有当您创建的GeneralEvent包含与您的每个事件相关的信息(即“喵喵”和“吠声”)时,此方法才有效。