3

vaadin ボタンのキャプションを 3 秒ごとに更新するためのこのコードがあります。

TimerTask tt = new TimerTask() {

    @Override
    public void run() {
        try {
            logger.debug("adding l to button's caption");
            btn.setCaption(eventsButton.getCaption() + "l");
        } catch (Exception ex) {
            logger.error(ex.getMessage());
        }
    }
};
Timer t = new Timer(true);
t.scheduleAtFixedRate(tt, 0, 3000);

ただし、3秒ごとに実行されますが(ログファイルから判断)、ボタンのキャプションを変更することはできません。別のスレッドから vaadin の GUI コンポーネントにアクセスするにはどうすればよいですか?

4

3 に答える 3

2

私が必要としていたものを正確に実行する ICEPush という名前のアドオンがあります。

https://vaadin.com/directory#addon/icepush

于 2012-08-02T04:03:11.363 に答える
1

問題のかなり包括的な議論と、さまざまな解決策がここにあります。Redux: 「vanilla」 Vaadin は、ユーザーが開始した要求と応答のパラダイムに従います。

サーバーからブラウザーで変更を開始するには、アドオンを使用する必要があります。

余談ですが、「同期」エラーが発生する可能性があるため、(通常のリクエスト スレッドではなく) 独自のスレッドからコンポーネントを更新する場合は、アプリケーション オブジェクトで同期する必要があります。

于 2012-07-19T06:53:58.643 に答える
0

Vaadin の動作方法が原因で、サーバー側で行われた非同期の UI 変更はクライアントに反映されません。更新アドオンを使用すると、ユーザーがトランザクションを開始しなくても、UI を変更できます。

final Refresher refresher = new Refresher();
refresher.setRefreshInterval(3000);
addComponent(refresher);

refresher.addListener(new RefreshListener() {    
    @Override
    public void refresh(final Refresher source) {
        try {
            logger.debug("adding l to button's caption");
            btn.setCaption(eventsButton.getCaption() + "l");
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }
}
于 2013-04-06T00:56:40.100 に答える