5

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

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

  1. 实例化事件总线
  2. 实例化 Parent Widget,接收 EventBus 所需的事件(例如,鼠标悬停或 rpc 回调)
  3. 将 EventBus 设置为侦听来自 Parent Widget 的事件。
  4. 实例化子小部件,谁应该向 EventBus 注册它拥有的侦听器(他们是否需要注册他们可能触发的事件?)
  5. 当 EventBus 接收到一个事件时,它应该对该事件做出决定,然后根据该决定采取行动,这是否意味着忽略它、更改事件类型,或者只是将它转发给所有适用的子小部件。

这通常应该如何工作?SimpleEventBus 仍然有点新,我在网上找不到太多关于如何真正使用它的信息。

4

2 回答 2

2

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

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

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

另一方面,像“resize”这样的事件很有意义,因为你所有的小部件都可能需要知道它。

于 2010-11-24T05:22:18.343 回答
0

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

您可能不想在其中触发任何 UI 事件:您的父小部件可以实现处理程序,或者您可以只使用匿名实例。

于 2010-11-23T21:53:59.557 回答