2016-09-16 11 views
0

Vaadin UI内のデータを変更したい。この変更は、残りの呼び出しによって呼び出されます。そこで、私は何とか、そのメソッドを呼び出すUIクラスへの参照が必要です。 changeValue(文字列値)。Vaadin:データを変更するUIの参照を取得

私は1.0.0

が何とか可能ということですvaadinスプリング・ブート・スターターを使用していますか?

EDIT:今すぐ別の質問: ビューは、ブロードキャストメッセージに更新されますように、私は、ビューの内部で、@Ericで述べたようサーバープッシュを、やろうとしました。ただし、これは動作しません(例外はありません。デバッグするものはありません。ビューには更新がありません)。これは私が私の見解で何をすべきかです:

@UIScope 
@SpringView(name = LoadWebsiteView.VIEW_NAME) 
@Push 
public class LoadWebsiteView extends VerticalLayout implements View, Broadcaster.BroadcastListener { 
... 

@Autowired 
public LoadWebsiteView(ScraperMainUI scraperMainUi) { 
    this.scraperMainUi = scraperMainUi; 
    Broadcaster.register(this); 
    initControlPane(); 
} 

@Override 
public void receiveBroadcast(String message) { 
    scraperMainUi.access(new Runnable() { 
     @Override 
     public void run() { 
      urlTxtField.setValue(message); 
     } 
    }); 
} 

を、ここで私は私のrestcontrollerで行うシンプルなものです:

Broadcaster.broadcast(text); 
+1

あなたはUIのインスタンスが10個開いているときにアクセスしたいのですか?おそらく、あなたはもっとよくキュー/放送システム –

+0

あなたの権利が良いだろうが、私はそれがアプリケーションの単一のユーザー構成の一部になるので、それは大丈夫だと思う。しかし、例えば、次のようなUIインスタンスを区別する可能性はあるか? ID? – eSKape

答えて

2

Vaadinのプッシュ機能と送信する方法は、あなたが探しているものですメッセージを登録された "クライアント"のリスト(この場合、変更について知っておく必要があるVaadin UI)に送信します。あなたはVaadinについて読むことができます

はここにプッシュ:Enabling Server Pushとも記事Advanced Push

にVaadinのプッシュ機能は、サーバーではなく、再び要求するために、ブラウザ上で待っているのクライアントへの更新を強制することができます。

メッセージコンポーネントは、購読しているUIにアクションが必要な更新があることを通知する方法として機能します。

これは、複数のユーザーがアクションアイテムであることとほぼ同じことを行うプロジェクトがあり、ユーザーが知る必要のある変更にも影響を与えることができる春のスケジュールされたタスクがあると述べました。

注:以下の例は、Enabling Server Pushの記事で利用可能な例に基づいています。

Broadcaster.java - ブロードキャストを受信するインスタンスを登録し、ブロードキャストを送信する機能を提供するメカニズムとして機能します。以下の例では、メッセージ(BroadcastMessage)を表すクラスを持っていますが、もちろんそれを単純化することもできます。

public class Broadcaster implements Serializable { 

    private static final long serialVersionUID = 3540459607283346649L; 

    static ExecutorService executorService = Executors.newSingleThreadExecutor(); 

    private static LinkedList<BroadcastListener> listeners = new LinkedList<BroadcastListener>(); 

    public interface BroadcastListener { 
     void receiveBroadcast(BroadcastMessage message); 
    } 

    public static synchronized void register(BroadcastListener listener) { 
     listeners.add(listener); 
    } 

    public static synchronized void unregister(BroadcastListener listener) { 
     listeners.remove(listener); 
    } 

    public static synchronized void broadcast(final BroadcastMessage message) { 
     for (final BroadcastListener listener: listeners) 
      executorService.execute(new Runnable() { 
       @Override 
       public void run() { 
        listener.receiveBroadcast(message); 
       } 
      }); 
    } 
} 

ここに私のBroadcastMessageのために定義したクラスがあります。アイデアは私が持っているメッセージの種類を示すための方法を持つことであり、また地図

public class BroadcastMessage implements Serializable { 

    private static final long serialVersionUID = 5637577096751222106L; 

    public BroadcastMessageType messageType; 
    public Map<String, String> params; 

    public BroadcastMessage() { 
    } 

    public BroadcastMessage(BroadcastMessageType messageType) { 
     this.messageType = messageType; 
     this.params = new HashMap<String, String>(); 
    } 

    public BroadcastMessage(BroadcastMessageType messageType, Map<String, String> params) { 
     this.messageType = messageType; 
     this.params = params; 
    } 

    public BroadcastMessageType getMessageType() { 
     return messageType; 
    } 
    public void setMessageType(BroadcastMessageType messageType) { 
     this.messageType = messageType; 
    } 
    public Map<String, String> getParams() { 
     return params; 
    } 
    public void setParams(Map<String, String> params) { 
     this.params = params; 
    } 

} 

の形でいくつかのペイロードこれは、ブロードキャストを聞きたいの例Vaadin UIです。 @Push注釈に注意してください。これがなければ、クライアントはブラウザが決定したときにのみリフレッシュします。 @Pushは、あなたのRESTインターフェースからメッセージを送信するには、それはすぐになります**

@SpringComponent 
@UIScope 
@Push 
@SpringView(name=TaskListComponent.NAME) 
public class TaskListComponent extends MyCustomComponent implements Broadcaster.BroadcastListener, View { 

    /** PRUNED DOWN, TO DEMONSTRATE THE KEY CODE **/ 

    // Register this window when we enter it 
    @Override 
    public void enter(ViewChangeEvent event) { 
     Broadcaster.register(this); 

    } 

    // Must also unregister when the UI expires  
    @Override 
    public void detach() { 
     Broadcaster.unregister(this); 
     super.detach(); 
    } 

    // Receive a broadcast 
    @Override 
    public void receiveBroadcast(BroadcastMessage message) { 

     getUI().access(new Runnable() { 
      @Override 
      public void run() { 
       // DO WHATEVER YOU NEED TO DO HERE. 
       // I CALLED INITIALIZE BUT IT COULD BE 
       // JUST YOU FIELD UPDATE 
       if (message.getMessageType().equals(BroadcastMessageType.REFRESH_TASK_LIST)) 
        initialize(); 
      } 
     }); 

    } 

} 

Broadcaster.broadcast( 
    new BroadcastMessage( 
     BroadcastMessageType.AUTO_REFRESH_LIST 
    ) 
); 

・ホープ、このことができます! :)

+0

素晴らしい答えエリック!絶対に完璧なソリューションです。私が試した唯一の他の解決策は、残りのインターフェイスがそこにデータを保存し、UIが毎秒ポーリングしていた(setPollInterval(1000);)、CustomPollListenerを使用して、DBまたはファイルの中間ストレージでした。しかし、あなたが描いた方法でそれを押すことははるかに優れています! – eSKape

関連する問題