43

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

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

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

4

8 回答 8

31

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

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

在观看了来自 Google IO 的Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App视频之后,Event Bus 的想法似乎很完美。

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


首先,创建 Handler 类。请注意对 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;
    }

}

现在,当重新加载这个主要数据结构时,我可以像这样使用这些 Handler 和 Event 类:

这段代码得到了数据结构,并想通知所有正在收听的人它已更新:

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

此代码是事件的实现

public class PopulateCategoryHandler implements CategoryChangeHandler {

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

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

}
于 2009-06-21T03:49:47.270 回答
23

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

这是当用户感到高兴时触发的事件。

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

public class HappyEvent extends GwtEvent {
  ...
}

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

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

interface HasHappyEvents {
  public HandlerRegistration addHappyHandler(HappyHandler handler);
}

添加唯一的事件类型

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

  public GwtEvent.Key getKey(){
    return KEY; 
  }
  ...
}

连接处理程序的 fire 方法

class HappyEvent extends GwtEvent {
  static Key<HappyEvent,HappyHandler> KEY = new Key<HappyEvent,HappyHandler>(){
    protected void fire(HappyHandler handler, HappyEvent event) {
       handler.onHappiness(event);
    };
   ...
}
于 2009-06-19T18:02:04.470 回答
4

这是Alex Reid 博客上的一个示例,包括一个操作代码示例的链接。该示例填充了一些模糊的部分,并且与 Nick 的示例一起,有助于阐明如何开始在您的 gwt 应用程序中构建事件总线。

于 2009-07-15T18:39:47.247 回答
2

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

它还包含一个示例项目,该项目准确展示了如何正确使用定义自定义事件和使用 GWT 的 HandlerManager 类。

于 2010-05-28T14:07:33.057 回答
1

使用 HandlerManger 创建自定义 GWT 事件应该不难,看看GwtEventBus @ NingZhang.info的例子,它真的很直观。使用的关键类是:

  • com.google.gwt.event.shared.HandlerManager
  • com.google.gwt.event.shared.GwtEvent
  • com.google.gwt.event.shared.EventHandler
于 2010-01-31T04:01:47.640 回答
1

另一个评论:如果您尝试在主应用程序中对从自定义 GUI 组件(如复合等)触发的事件做出类似反应,我认为您必须明确连接主应用程序以处理组件的事件:

yourComponent.addHandler(this, YourEvent.TYPE);

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

于 2011-05-24T12:20:30.637 回答
0

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

于 2009-06-15T22:34:45.040 回答
0

您可能想看看 GWT 1.6 中的ValueChangeHandlerValueChangeEvent。这些可能适用于您正在尝试做的事情。

于 2009-06-17T19:56:42.107 回答