43

Event と Handler のカスタム セットを作成する例を教えてください。更新されたかどうかをウィジェットに知らせたい Person オブジェクトがあるとします。

HandlerManager を作成したら、次に Event と Handler を作成する必要があります。イベントをサブスクライブして起動できるようにするには、これらのクラスをどのように定義しますか?

ほとんどのイベントは DOM ベースですが、ブラウザーベースのイベントの外部で起動できるカスタム イベントとハンドラーをいくつか作成したいと考えています。

4

8 に答える 8

31

すべての応答に感謝します。Zakness は、私が必要としていた答えを得るのに最も近かったのですが、少し単純なモデルを思いつきました。

私の主な目標は、メインのデータ構造に静的変数を使用しないようにすることでした。また、アクセスしようとしたときにメインのデータ構造がデータベースから正常に取得されたかどうか、そうでない場合 (つまり、null の場合) に何をすべきかを把握しようとする問題にも遭遇しました。

Google Web Toolkit Architecture: Best Practices For Architecting Your GWT Appビデオ (Google IO から)を見た後、イベント バスのアイデアは完璧に思えました。

他の人に役立つ場合に備えて、ここに私のソリューションを投稿します。


まず、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 のブログの例です。この例は、あいまいなビットの一部を埋めており、ここにあるニックの例とともに、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を見てください。Googleの「gwtPropertyChange」を使用すると、その使用方法を説明する複数のブログが表示されます。

于 2009-06-15T22:34:45.040 に答える
0

GWT 1.6のValueChangeHandlerValueChangeEventを確認することをお勧めします。それらはあなたがやろうとしていることでうまくいくかもしれません。

于 2009-06-17T19:56:42.107 に答える