3

ビューの他の部分が更新/削除/更新されるように、カスタム イベントを作成し、ビューの一部でそれらを起動したいと考えています。

Component.Event と Component.Listener を拡張してみましたが、うまくいきません。イベントとリスナーは同じコンポーネント インスタンスに制限する必要があると思います。

これは Vaadin 7 で実行できますか?

基本的に、ビューを切り離して、コンポーネント間の通信を容易にしたいと考えています。Vaadin で Spring も使用しています。オブザーバー パターンの横にもっと良いアイデアがあれば、それもありがたいです。

ありがとうございました

4

3 に答える 3

3

必要なもの:
1. イベントを発生させるコンポーネント
2. カスタム イベント クラス
3. リスナー インターフェイス
4. リスナーの実装

1 からのコンポーネントには、イベント リスナーとメソッドのリストが必要addListenerです。removeListener; とdispatchEvent。-method は、dispatchEventイベント リスナーのリストを繰り返し処理し、何らかのメソッドを実行します (4: リスナーの実装を参照)。そのメソッドは引数としてイベント オブジェクトを持っています (2: カスタム イベント クラスを参照)。

1 の必須コード:

protected List<MyListener> listeners; 

protected synchronized void dispatchEvent(MyEvent event) {
   if (listeners != null) {
      for (MyListener listener : listeners) {
         listener.myMethod(event);
      }
   }
}

public synchronized void addListener(MyListener listener) {
   if (listeners == null) {
      listeners = new ArrayList<MenuListener>();
   }
   listeners.add(listener);
}

public synchronized void removeListener(MyListener listener) {
   if (listeners == null) {
       listeners = new ArrayList<MyListener>();
       return;
   }
   listeners.remove(listener);
}

2 の必須コード:

public class MyEvent {
   protected String eventType;

   public MyEvent(String eventType) {
      this.eventType = eventType;
   }

   //getters and setters
}

3の必須部分:

public interface MyListener {
    public void doSomething(MyEvent event);
}

4 のコード (リスナーの実装)

public class MyImplementation implements MyListener {

    @Override
    public void doSomething(myEvent event) {
        //do something concretes here
    }
}

コード フローのしくみ:
ディスパッチャー クラスは、何らかのやり取りの後、すべてのイベント リスナーに何かが発生したことを「アナウンス」します。

dispatchEvent(new MyEvent("ADD_USER"));

イベントを受け取りたいクラスでは、ディスパッチャー クラスとリスナー実装クラスをインスタンス化し、リスナーをディスパッチャーのリストに追加する必要があります。

MyDispatcher disp = new MyDispatcher();
MyImplementation myImpl = new MyImplementation();
// Then add the event-listener to the dispatcher:
disp.addListener(myImpl);

確かに、これらのクラスの一部は内部クラスにすることができ、コードは単純化または拡張できますが、これは一般的な考え方です。これも単純な Java であり、Vaadin に依存するものは何もありません。

于 2013-08-21T19:29:45.970 に答える
0

EventRouter を使用できます。しかし、私はそれを使用しません。

または ObjectProperty を使用できます。

このオブジェクトは、値が変更されたときにイベントを発生させることができます。例えば:

public class MyApplication extends UI{
  private ObjectProperty<MyState> myState= new ObjectProperty<MyEvent>(new MyState());

  public ObjectProperty<MyState> getMyState(){return myState;}

}


public class MyComponent1 extends VerticalLayout{

  public MyComponent1(){

  //create UI
  ....

  updateData();

  Property.ValueChangeListener updateListener = new Property.ValueChangeListener() {
                    @Override
                    public void valueChange(Property.ValueChangeEvent event) {
                       updateData();
                    }
                };
  MyApplication.getCurrent().getDispatcher().addValueChangeListener(updateListener);


  }

private void updateData(){
  MyState myState = MyApplication.getCurrent().getMyState().getValue();

  //update this component with myState

}
}

 public class MyComponent2 extends VerticalLayout{/*Similarly with Component1*/}
于 2014-12-12T18:20:05.133 に答える
0

実際、あなたが言ったように、ビューを分離し、簡単なイベントベースのコミュニケーションを提供するために、Vaadin 上に構築されたフレームワークがいくつかあります。このアプローチは MVP パターン -モデル ビュー プレゼンターevent driverと呼ばれ、コンポーネント間の通信を提供し ます。その時点で利用可能ないくつかの MVP Vaadin フレームワークがあります。

https://github.com/peholmst/MVP4Vaadin

https://github.com/panter/org.vaadin.mvp

于 2013-08-22T08:54:17.060 に答える