如何使用GWT';是SimpleEventBus还是EventBus?

如何使用GWT';是SimpleEventBus还是EventBus?,gwt,gwt-mvp,Gwt,Gwt Mvp,我正在开发一些简单的绘图软件,需要在swing和gwt中实现。在gwt方面,我将使用gwt-g2d作为画布。我希望在两个实现中使用eventbus来简化一些软件 我的理解是应该是这样的: 实例化事件总线 实例化父窗口小部件,接收事件总线所需的事件(例如,mouseover或rpc回调) 设置EventBus以侦听来自父窗口小部件的事件 实例化子窗口小部件,谁应该向EventBus注册它拥有的侦听器(它们是否需要注册可能触发的事件?) 当EventBus接收到一个事件时,它应该对该事件做出决定,然

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

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

  • 实例化事件总线
  • 实例化父窗口小部件,接收事件总线所需的事件(例如,mouseover或rpc回调)
  • 设置EventBus以侦听来自父窗口小部件的事件
  • 实例化子窗口小部件,谁应该向EventBus注册它拥有的侦听器(它们是否需要注册可能触发的事件?)
  • 当EventBus接收到一个事件时,它应该对该事件做出决定,然后根据该决定采取行动,无论这意味着忽略它、更改事件类型,还是仅仅将其转发给所有适用的子窗口小部件

  • 这通常是它应该如何工作的吗?SimpleEventBus还是一种新功能,我在web上找不到太多关于如何真正使用它的信息。

    据我所知,GWT事件总线是针对应用程序范围内的事件的(想想“系统范围对象x chanded属性y”;任何侦听特定事件的东西都可以对其进行操作)。这有助于分离应用程序逻辑


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

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

    类似地,任何对象都可以使用SimpleEventBus.addHandler()侦听这些事件。这与您的#4最接近-addHandler接受一种类型的事件和一个处理程序,因此每当该类型的事件通过应用程序中的某个对象传递给
    fireEvent
    ,该处理程序都会传递给该事件。请注意,
    事件
    调用的是处理程序,而不是EventBus!EventBus只调用event.dispatch(处理程序),事件的程序员负责调用处理程序中的适当函数。您的#5是不准确的,至少对于SimpleEventBus来说是这样-SimpleEventBus根本不检查事件,只是查看要调用哪些处理程序。它不知道任何子部件或任何应用程序逻辑,也从不更改事件的类型

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


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

    我认为它的部分吸引力在于它使使用UI事件注入的自动化测试用例变得容易。无论如何,我之所以尝试这样做是因为一个画布可能有4个图形区域,而这些区域可能有4个图形对象彼此放置。如果我点击一个图形对象,我需要运行一些逻辑来查看哪个被选中,因为一个点可能会重叠。我的自定义事件将是诸如调整大小、新数据、新数据窗口、新比例等……我是通过GWT开发人员建议的MVP的眼光来看待EventBus的。他们测试UI的方法是将其抽象为视图,在测试时可以将其替换为假人。您的案例有些不同,因为每个画布可能有一个EventBus来管理所有画布事件。我仍然建议只触发您自己的事件(调整大小、旋转…),这将影响许多目标。