GWT自定义事件处理程序

43

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

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

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

8个回答

31

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

我的主要目标是避免对我的主数据结构使用静态变量。我也遇到了一个问题,即在尝试访问它时如何确定该主数据结构是否成功地从数据库中检索出来以及当它为 null 时该怎么办。

在观看了 Google IO 的“Google Web Toolkit 架构:彻底掌握 GWT 应用程序的最佳实践”视频后,事件总线的理念似乎是完美的。

如果我的解决方案能够帮助其他人,我会在此发布。


首先,创建 Handler 类。请注意已经引用了 Event 类:

public interface CategoryChangeHandler extends EventHandler {
    void onCategoryChange(CategoryChangeEvent 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);

这段代码是事件(Event)的一个实现

public class PopulateCategoryHandler implements CategoryChangeHandler {

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

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

}

1
如果您能提供创建eventBus的代码,那就太好了。这是您自己编写的类吗? - Ethan Leroy
静态的EventBus eventBus = GWT.create(SimpleEventBus.class); - Nikita Zhiltsov

23

以下是一个非常详细的自定义事件示例,直接摘自GwtEventSystem Wiki(当事件系统仍在GWT孵化器中时)。

该事件会在用户感到高兴时被触发。

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

public class HappyEvent extends GwtEvent {
  ...
}

定义一个新的处理程序(handler)和标记接口(marker interface),用于事件类(event class)。

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);
    };
   ...
}

19
很不幸,这个答案现在已经非常过时了(作者已经预料到了)。如果想要了解更全面的GWT自定义事件概述,请参考这个较新的问题和答案:https://dev59.com/UHA85IYBdhLWcg3wEPZL。 - Eric Nguyen

4
这里有一个例子在Alex Reid的博客上,包括一个操作代码的链接。这个例子填补了一些模糊的地方,与Nick在这里的例子一起,帮助澄清如何开始为您的gwt应用程序构建事件总线。

1
希望这个例子对你有用。 :) - AlexJReid

2

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

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


1
一个额外的注释:如果你尝试在主应用程序中类似于React对从自定义GUI组件(如合成等)触发的事件进行处理,我认为你必须明确地将主应用程序与组件的事件连接起来。
yourComponent.addHandler(this, YourEvent.TYPE);

"this" 是实现你自定义处理程序接口的类。


1
使用 HandlerManager 创建自定义 GWT 事件不应该很难,看一下这个例子 GwtEventBus @ NingZhang.info,它非常直观。关键的类包括:
  • com.google.gwt.event.shared.HandlerManager
  • com.google.gwt.event.shared.GwtEvent
  • com.google.gwt.event.shared.EventHandler

0

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接