GWT自定义事件处理程序

时间:2009-06-15 21:58:25

标签: java events gwt javascript-events

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

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

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

8 个答案:

答案 0 :(得分:31)

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

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

观看来自Google IO的Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App视频后,事件总线的想法似乎很完美。

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


首先,创建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);

此代码是Event

的实现
public class PopulateCategoryHandler implements CategoryChangeHandler {

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

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

}

答案 1 :(得分: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);
    };
   ...
}

答案 2 :(得分:4)

这是an example of this over on Alex Reid's blog, including a link to an operational code example。该示例填充了一些模糊位,并且与Nick的示例一起,有助于阐明在gwt应用程序中构建事件总线的入门。

答案 3 :(得分:2)

我认为最完整,最详细的例子是this article

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

yourComponent.addHandler(this, YourEvent.TYPE);

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

答案 6 :(得分:0)

听起来你想要PropertyChange *支持。看看gwtx。谷歌'gwt PropertyChange',您将获得多个博客,解释如何使用它。

答案 7 :(得分:0)

您可能想要查看GWT 1.6中的ValueChangeHandlerValueChangeEvent。那些可能适用于你想要做的事情。