GWT自定义事件处理程序

有人可以给我一个创build一个事件和处理程序的自定义集的例子。 假设你有一个Person对象,你希望你的小部件知道它是否得到更新。

你创build一个HandlerManager,现在你必须创build一个事件和一个Handler。 你将如何定义这些类,以便你可以订阅和触发事件?

大多数事件是基于DOM的,而我想创build一些自定义事件和处理程序,以便在任何基于浏览器的事件之外触发。

下面是一个非常全面的创build自定义事件的例子,从GwtEventSystem Wiki (当事件系统仍然在GWT的孵化器中)逐字logging。

这是用户开心时触发的事件。

定义一个新的事件类。 您可以在事件类中添加任意的元数据。 为了简单起见,我们不会在这里包含任何内容。

public class HappyEvent extends GwtEvent { ... } 

为事件类定义一个新的处理程序和标记接口。

 interface HappyHandler extends EventHandler { public void onHappiness(HappyEvent event); } interface HasHappyEvents { public HandlerRegistration addHappyHandler(HappyHandler handler); } 

添加一个唯一的事件types

 class HappyEvent extends AbstractEvent{ public static AbstractEvent.Key KEY = new AbstractEvent.Key(){...} public GwtEvent.Key getKey(){ return KEY; } ... } 

连接处理程序的消防方法

 class HappyEvent extends GwtEvent { static Key<HappyEvent,HappyHandler> KEY = new Key<HappyEvent,HappyHandler>(){ protected void fire(HappyHandler handler, HappyEvent event) { handler.onHappiness(event); }; ... } 

感谢所有的答复。 扎克内斯最接近地给了我需要的答案,但是,我想出了一个稍微简单的模型。

我的主要目标是避免使用静态variables到我的主要数据结构。 我也遇到了这个问题,试图找出主要数据结构是否成功地从数据库中检索,当它试图访问它时,如果不是(即它是空的时候)该怎么做。

在观看Google Web Toolkit架构:从Google IO 构build您的GWT Appvideo的最佳实践之后 ,Event Bus的想法看起来很完美。

我会在这里发布我的解决scheme,以防别人帮助其他人。


首先,创buildHandler类。 注意已经引用了Event类:

 public interface CategoryChangeHandler extends EventHandler { void onCategoryChange(CategoryChangeEvent event); } 

现在进入Event类。 这给了我最大的麻烦:

 public class CategoryChangeEvent extends GwtEvent<CategoryChangeHandler> { private final List<Category> category; public CategoryChangeEvent(List<Category> category) { super(); this.category = category; } public static final Type<CategoryChangeHandler> TYPE = new Type<CategoryChangeHandler>(); @Override protected void dispatch(CategoryChangeHandler handler) { handler.onCategoryChange(this); } @Override public com.google.gwt.event.shared.GwtEvent.Type<CategoryChangeHandler> getAssociatedType() { return TYPE; } public List<Category> getCategories(){ return category; } } 

现在我可以像这样使用这些处理程序和事件类,当这个主要的数据结构重新加载:

这段代码得到了数据结构,并且想要通知所有正在监听它的人:

 CategoryChangeEvent event = new CategoryChangeEvent(result); eventBus.fireEvent(event); 

这段代码是Event的一个实现

 public class PopulateCategoryHandler implements CategoryChangeHandler { @Override public void onCategoryChange(CategoryChangeEvent event) { tearDownCategories(); List<Category> categories = event.getCategories(); populateCategories(categories); } } 

以下是Alex Reid博客上的一个例子,包括一个操作代码示例的链接 。 这个例子填补了一些模糊的位,并且与Nick的例子一起,帮助澄清在你的gwt应用程序中构build一个事件总线的入门。

我认为这篇文章中最完整和详细的例子

它还包含一个示例项目,显示如何正确使用定义自定义事件,并使用GWT的HandlerManager类。

使用HandlerManger创build自定义GWT事件不应该这么难,看一下示例GwtEventBus @ NingZhang.info它是真正直观的。 使用的关键类是:

  • com.google.gwt.event.shared.HandlerManager
  • com.google.gwt.event.shared.GwtEvent
  • com.google.gwt.event.shared.EventHandler

另外一个评论:如果你尝试做类似的事情在主应用程序中对从自定义GUI组件(比如复合等)触发的事件做出反应,我想你必须显式连接主应用程序来处理组件的事件:

 yourComponent.addHandler(this, YourEvent.TYPE); 

其中“this”是实现您的自定义处理程序接口的类。

听起来像你想PropertyChange *支持。 看看gwtx 。 谷歌“gwt PropertyChange”,你会得到解释如何使用它的多个博客。

您可能想看看GWT 1.6中的ValueChangeHandler和ValueChangeEvent 。 这些可能会为你想要做的工作。