微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java中更容易的自定义事件处理

如何解决Java中更容易的自定义事件处理

| 在Java中,每次我想创建一个新的自定义事件时,通常都通过添加3种方法来做到这一点:
addDogEventListener(EventListener listener); 
removeDogEventListener(EventListener listener);
dispatchDogEventListener(DogEvent event);
然后,如果我想调度另一个事件,例如CatEvent,我将不得不再次创建所有这三个方法
addCatEventListener(EventListener listener); 
removeCatEventListener(EventListener listener);
dispatchCatEventListener(CatEvent event);
然后,如果我只想管理一种CatEvent事件,请说喵,我必须再次复制并粘贴所有这三种方法吗?像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种方法,以及为每种不同类型的方法创建这么多不同类型的事件对象想发吗? 谢谢!     

解决方法

           然后,如果我只想管理一种CatEvent事件,请说喵,(和EAT) 事件(MEOW或EAT)的\“ action \”应该是CatEvent中定义的数据。然后,您的事件侦听代码将检查操作类型并进行适当的处​​理。 也许看看TableModelEvent看看如何完成。它使用同一事件处理“插入”,“删除”和“更新”事件。 同样,您可能可以基于PropertyChangeListener为通用事件侦听器建模。当Swing组件上的各种属性发生更改时,PropertyChangeListener用于处理事件。例如,当您调用setForeground()或setBackground()或setFont()或setText()或setIcon时。 PropertyChangeListener使用getName()方法来确定已更改的属性。因此,对于上述方法,名称将为\“ foreground \”,\“ background \”,\“ font \”,\“ text \”,\“ icon \”。有关如何工作的示例,请参见如何使用属性更改侦听器。 在您的情况下,名称将为\“ cat \”和\“ dog \”。仅当您创建的GeneralEvent可以包含与每个事件相关的信息(即\“ meow \”和\“ bark \”)时,此方法才有效。     ,        我具有的事件处理策略是按可能适合您的类型发布。 我有一个代理,可以检查侦听器的注释,以将方法标记为侦听事件。使用这种方法,只需要在要处理特定事件类时添加方法。
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.
}
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。