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 。 这些可能会为你想要做的工作。