你如何使用GWT的SimpleEventBus或EventBus?

时间:2010-11-23 18:24:59

标签: gwt gwt-mvp

我正在开发一些简单的图形软件,需要在swing和gwt中实现。在gwt方面,我将使用gwt-g2d作为画布。我希望在两个实现中使用事件总线来简化某些软件。

我的理解是它应该是这样的:

  1. 实例化EventBus
  2. 实例化父窗口小部件,为EventBus接收所需的事件(例如,鼠标悬停或rpc回调)
  3. 设置EventBus以侦听来自Parent Widget的事件。
  4. 实例化子窗口小部件,谁应该向EventBus注册它拥有的监听器(他们是否需要注册可能触发的事件?)
  5. 当EventBus收到一个事件时,它应该对该事件做出决定,然后根据该决定采取行动,无论是忽略它,更改事件类型,还是仅将其转发给所有适用的子窗口小部件。
  6. 这一般应该如何运作? SimpleEventBus仍然是一种新的,我在网上找不到有关如何真正使用它的更多内容。

2 个答案:

答案 0 :(得分:2)

SimpleEventBus提供了存储处理程序集合的基本功能,并在适当时调用了所有相关处理程序的event.dispatch()。我不会说你从父窗口小部件“设置EventBus来监听事件”。 SimpleEventBus没有“父”的概念。相反,您传递对SimpleEventBus的引用。然后,任何对象都可以使用SimpleEventBus.fireEvent方法“触发事件”。没有等级。

同样,任何对象都可以使用SimpleEventBus.addHandler()侦听这些事件。这最接近你的#4 - addHandler接受事件的类型和一个处理程序,所以每当这种类型的事件传递给fireEvent时(通过应用程序中的某些东西),该处理程序将被传递给活动。请注意,Event是调用处理程序的,而不是EventBus! EventBus只调用event.dispatch(theHandler),事件的程序员负责调用theHandler中的正确函数。您的#5是不准确的,至少对于SimpleEventBus而言 - SimpleEventBus根本不检查事件,除了查看要调用的处理程序。它不知道任何子窗口小部件或任何应用程序逻辑,也从不更改事件的类型。

关于查看哪个区域被选中的逻辑在EventBus中是不合适的 - 相反,您将创建一个执行逻辑并侦听ClickEvents的处理程序。然后,该处理程序可以告诉所选区域它是直接选择的,或者您可以创建自己的RegionSelectionEvent,可以沿EventBus触发,然后可以通知所有区域已发生RegionSelection,并且您的记录器可以获得通知,或者您的服务器监视器可以获取通知并通知老板某人选择了某个区域,或者其他什么。如果您只需要取消选择一个区域并选择另一个区域,则事件总线就会过度。

另一方面,像“调整大小”事件这样的事情很有意义,因为你的所有小部件都可能需要了解它。

答案 1 :(得分:0)

据我了解GWT EventBus,它适用于应用程序范围内的事件(想想“系统范围对象x chanded属性y”;任何侦听该特定事件的事件都可以对其进行操作)。这有助于您分离应用程序逻辑。

您可能不希望将任何UI事件激活到其中:您的父窗口小部件可以实现处理程序,也可以只使用匿名实例。