0

アプリケーション全体のイベントをディスパッチするために EventBus を使用するアプリケーションがあります。何らかの理由で、1 つのイベントを呼び出してから、2 番目のイベントを発生させる直前にハンドラーを登録しようとすると、ディスパッチされません。イベントにハンドラーを動的に登録する他の方法はありますか? 以下のコードを参照してください。

MyEntry.java

package com.example.eventbus.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

public class MyEntry 
implements EntryPoint {
    SimpleEventBus bus;
    @Override
    public void onModuleLoad() {
        bus = new SimpleEventBus();
        fireEvent1();
    }

    private void fireEvent1(){
      bus.addHandler(MyEvent1.TYPE,new MyEvent1.Handler() {

          @Override
          public void onEvent1(MyEvent1 event) {
              RootPanel.get().add(new Label("Event1"));
              fireEvent2();
          }
      });
      bus.fireEvent(new MyEvent1());
    }

    private void fireEvent2(){
        bus.addHandler(MyEvent2.TYPE,new MyEvent2.Handler() {

            @Override
            public void onEvent2(MyEvent2 event) {
                RootPanel.get().add(new Label("Event2")); //!!!!!This line is not being called
            }
        });
        bus.fireEvent(new MyEvent2());
    }
}

MyEvent1.java

package com.example.eventbus.client;

import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;

public class MyEvent1 extends GwtEvent<MyEvent1.Handler>{
    public static Type<MyEvent1.Handler> TYPE=new Type<MyEvent1.Handler>();

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<Handler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(Handler handler) {
        System.out.println("dispatch Event1");
        handler.onEvent1(this);
    }

    public interface Handler extends EventHandler{
        public void onEvent1(MyEvent1 event);
    }
}

MyEvent2.java

package com.example.eventbus.client;

import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;

public class MyEvent2 extends GwtEvent<MyEvent2.Handler>{
    public static Type<MyEvent2.Handler> TYPE=new Type<MyEvent2.Handler>();

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<Handler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(Handler handler) {
        System.out.println("dispatch Event2"); //!!!! This line is never called
        handler.onEvent2(this);
    }

    public interface Handler extends EventHandler{
        public void onEvent2(MyEvent2 event);
    }
}
4

3 に答える 3

1

問題は、イベント バスがイベントを発生させている間、追加または削除されたハンドラーをキューに入れ、終了時にそれらを処理することです。アイデアは、別のイベントがまだ始まっている間に何かを聞き始めた場合、このラウンドのイベントには興味がなく、次のラウンドに興味があるということです. ハンドラーを削除するときも同じことが起こります。まだ発生中のイベントについて聞くことはできますが、イベント バスの起動が完了すると、削除が処理されます。

コードを変更して、何かを起動する前に両方のハンドラーを接続してから、1 つのイベントを別のイベントに起動してみてください。

于 2014-01-09T20:54:05.357 に答える
0

「カスタム イベント」と呼ばれるgwtqueryの新機能を試すことをお勧めします。

最近の GWT.create カンファレンスで新しいイベント メカニズムを紹介しました。このスライドを見てください(スライド間を移動するには矢印を使用します)。

カスタム イベントは、DOM ツリー、ウィジェット、およびウィンドウ要素の任意の要素にアタッチできます。

その後、コード内の任意の場所からイベントをトリガーでき、このカスタム イベント名を持つすべてのハンドラーが実行されます。

gQuery アプローチの主な目的は、シンプルであることとは別に、gwt イベントバスよりもパフォーマンスが大幅に向上することです。これは、ネイティブ ブラウザが、javascript を使用してリストをループし、ハンドラを実行する代わりに、実行するハンドラを低レベルの方法で選択するためです。順次。

于 2014-01-09T21:06:13.397 に答える