首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GWT自定义事件处理程序

GWT自定义事件处理程序
EN

Stack Overflow用户
提问于 2009-06-15 21:58:25
回答 8查看 58K关注 0票数 43

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

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-06-19 18:02:04

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

这是当用户变得快乐时触发的事件。

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

代码语言:javascript
运行
复制
public class HappyEvent extends GwtEvent {
  ...
}

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

代码语言:javascript
运行
复制
interface HappyHandler extends EventHandler {
  public void onHappiness(HappyEvent event);
}

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

添加唯一的事件类型

代码语言:javascript
运行
复制
class HappyEvent extends AbstractEvent{
  public static AbstractEvent.Key KEY = new AbstractEvent.Key(){...}

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

连接处理程序的fire方法

代码语言:javascript
运行
复制
class HappyEvent extends GwtEvent {
  static Key<HappyEvent,HappyHandler> KEY = new Key<HappyEvent,HappyHandler>(){
    protected void fire(HappyHandler handler, HappyEvent event) {
       handler.onHappiness(event);
    };
   ...
}
票数 23
EN

Stack Overflow用户

发布于 2009-06-21 03:49:47

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

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

在看了来自谷歌IO的Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App视频后,事件总线的想法看起来很完美。

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

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

代码语言:javascript
运行
复制
public interface CategoryChangeHandler extends EventHandler {
    void onCategoryChange(CategoryChangeEvent event);
}

现在转到Event类。这给我带来了最大的麻烦:

代码语言:javascript
运行
复制
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;
    }

}

现在,当这个主数据结构重新加载时,我可以像这样使用这些处理程序和事件类:

这段代码获得了数据结构,并希望通知正在监听的每个人它已更新:

代码语言:javascript
运行
复制
CategoryChangeEvent event = new CategoryChangeEvent(result);
eventBus.fireEvent(event);

此代码是事件的实现

代码语言:javascript
运行
复制
public class PopulateCategoryHandler implements CategoryChangeHandler {

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

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

}
票数 31
EN

Stack Overflow用户

发布于 2009-07-15 18:39:47

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/998621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档