イベントとハンドラーのカスタムセットを作成する例を教えてください。ウィジェットが更新されたかどうかを知りたいPersonオブジェクトがあるとします。
HandlerManagerを作成し、イベントとハンドラーを作成する必要があります。イベントをサブスクライブして起動できるように、これらのクラスをどのように定義しますか?
ほとんどのイベントはDOMベースですが、ブラウザベースのイベントの外部で起動できるカスタムイベントとハンドラーをいくつか作成したいです。
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);
};
...
}
すべての回答をありがとう。 Zaknessが私に必要な答えを私に与えるのに最も近かったが、私は少し単純なモデルを思いついた。
私の主な目標は、メインデータ構造に静的変数を使用することを避けることでした。また、メインデータ構造にアクセスしようとしたときにそのメインデータ構造がデータベースから正常に取得されたかどうか、およびそうでない場合(つまり、nullの場合)に何をすべきかを把握しようとするという問題にぶつかりました。
Google Web Toolkitアーキテクチャ:GWTアプリを設計するためのベストプラクティス Google IOのビデオを見た後、イベントバスのアイデアは完璧に見えました。
他の人に役立つ場合に備えて、ここにソリューションを投稿します。
最初に、Handlerクラスを作成します。既にイベントクラスへの参照に注意してください。
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);
このコードは、イベントの実装です
public class PopulateCategoryHandler implements CategoryChangeHandler {
@Override
public void onCategoryChange(CategoryChangeEvent event) {
tearDownCategories();
List<Category> categories = event.getCategories();
populateCategories(categories);
}
}
Alex Reidのブログのこの例(運用コードの例へのリンクを含む) です。この例では、ファジービットの一部を埋め、ここでのニックの例とともに、gwtアプリケーションでイベントバスの設計を開始することを明確にするのに役立ちます。
最も完全で詳細な例は この記事 にあると思います
また、カスタムイベントの定義とGWTのHandlerManagerクラスの適切な使用方法を正確に示すサンプルプロジェクトも含まれています。
追加コメント:メインGUIアプリケーションでカスタムGUIコンポーネント(コンポジットなど)から起動されたイベントに反応するのと同じようなことをしようとすると、メインアプリを明示的に配線してコンポーネントのイベントを処理する必要があると思います。
yourComponent.addHandler(this, YourEvent.TYPE);
「this」は、カスタムハンドラーインターフェースを実装するクラスです。
HandlerMangerを使用してカスタムGWTイベントを作成するのはそれほど難しくないはずです。例をご覧ください GwtEventBus @ NingZhang.info それは本当に直感的です。使用される主要なクラスは次のとおりです。
GWT 1.6の ValueChangeHandler および ValueChangeEvent をご覧ください。それらはあなたがやろうとしていることのために働くかもしれません。
PropertyChange *サポートが必要なようです。 gwtx をご覧ください。 Google 'gwt PropertyChange'を使用すると、使用方法を説明する複数のブログが表示されます。