簡體   English   中英

GWT自定義事件處理程序

[英]GWT Custom Event Handler

有人可以給我一個創建自定義事件和處理程序集的示例。 假設您有一個Person對象,您希望小部件知道它是否已更新。

您創建一個HandlerManager,現在您必須創建一個事件和一個處理程序。 您將如何定義這些類,以便您可以訂閱和觸發事件?

大多數事件都是基於DOM的,而我想創建一些自定義事件和處理程序,我可以在任何基於瀏覽器的事件之外觸發。

感謝所有的回復。 Zakness最接近給我我需要的答案,然而,我想出了一個稍微簡單的模型。

我的主要目標是避免在我的主數據結構中使用靜態變量。 我還遇到了一個問題,試圖弄清楚在嘗試訪問它時是否已成功從數據庫中檢索到主數據結構,以及當它沒有時(即當它為空時)該怎么做。

觀看Google Web Toolkit架構:從Google IO 構建您的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);

此代碼是Event的實現

public class PopulateCategoryHandler implements CategoryChangeHandler {

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

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

}

這是一個非常全面的例子,創建一個自定義事件,從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);
    };
   ...
}

以下是Alex Reid博客上的一個示例,包括操作代碼示例的鏈接 該示例填充了一些模糊位,並且與Nick的示例一起,有助於闡明在gwt應用程序中構建事件總線的入門。

我認為最完整和最詳細的例子在本文中

它還包含一個示例項目,該項目准確顯示如何正確使用定義自定義事件並使用GWT的HandlerManager類。

使用HandlerManger創建自定義GWT事件不應該這么難,看看GwtEventBus @ NingZhang.info這個例子它是真實直觀的。 使用的關鍵類是:

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

另外一條評論:如果您嘗試做類似的事情,在主應用程序中對從自定義GUI組件(如復合等)觸發的事件做出反應,我認為您必須明確連接主應用程序以處理組件的事件:

yourComponent.addHandler(this, YourEvent.TYPE);

其中“this”是實現自定義處理程序接口的類。

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

聽起來你想要PropertyChange *支持。 看看gwtx 谷歌'gwt PropertyChange',您將獲得多個博客,解釋如何使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM