GWT自定义事件处理程序

Nic*_*ick 43 java events gwt dom-events

有人可以给我一个创建自定义事件和处理程序集的示例.假设您有一个Person对象,您希望小部件知道它是否已更新.

您创建一个HandlerManager,现在您必须创建一个事件和一个处理程序.您将如何定义这些类,以便您可以订阅和触发事件?

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

Nic*_*ick 31

感谢所有的回复.Zakness最接近给我我需要的答案,然而,我想出了一个稍微简单的模型.

我的主要目标是避免在我的主数据结构中使用静态变量.我还遇到了一个问题,试图弄清楚在尝试访问它时是否已成功从数据库中检索到主数据结构,以及当它没有时(即当它为空时)该怎么做.

观看Google Web Toolkit架构:从Google IO 构建您的GWT App视频的最佳实践后,Event Bus的想法似乎很完美.

我会在这里发布我的解决方案,以防它帮助其他人.


首先,创建Handler类.请注意对Event类的引用:

public interface CategoryChangeHandler extends EventHandler {
    void onCategoryChange(CategoryChangeEvent event);
}
Run Code Online (Sandbox Code Playgroud)

现在进入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;
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,当重新加载这个主数据结构时,我能够使用这些Handler和Event类:

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

CategoryChangeEvent event = new CategoryChangeEvent(result);
eventBus.fireEvent(event);
Run Code Online (Sandbox Code Playgroud)

此代码是Event的实现

public class PopulateCategoryHandler implements CategoryChangeHandler {

    @Override
    public void onCategoryChange(CategoryChangeEvent event) {
        tearDownCategories();

        List<Category> categories = event.getCategories();
        populateCategories(categories); 
    }

}
Run Code Online (Sandbox Code Playgroud)


Zak*_*der 23

这是一个非常全面的例子,创建一个自定义事件,从GwtEventSystem Wiki逐字逐句(当事件系统仍在GWT的孵化器中时).

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

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

public class HappyEvent extends GwtEvent {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

interface HappyHandler extends EventHandler {
  public void onHappiness(HappyEvent event);
}

interface HasHappyEvents {
  public HandlerRegistration addHappyHandler(HappyHandler handler);
}
Run Code Online (Sandbox Code Playgroud)

添加唯一的事件类型

class HappyEvent extends AbstractEvent{
  public static AbstractEvent.Key KEY = new AbstractEvent.Key(){...}

  public GwtEvent.Key getKey(){
    return KEY; 
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

连接处理程序的fire方法

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

  • 不幸的是,到目前为止,这个答案已经非常糟糕(作者已经预料到了).有关GWT中自定义事件的更全面概述,请参阅此更新的问题和答案:http://stackoverflow.com/questions/2951621/gwt-custom-events (19认同)