2012-07-19 115 views
3

我有這個代碼用於每3秒更新vaadin按鈕的標題。異步更新vaadin組件

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組件?

+0

找到了解決辦法 - 使用ICEPusher插件解決了這個問題 – Sergey 2012-07-19 04:15:08

回答

1

該問題的合理全面的討論,以及各種解決方案可以找到here; Redux:'vanilla'Vaadin只是遵循用戶發起的請求 - 響應範例。

您需要使用插件才能從服務器啓動瀏覽器中的更改。

另外:當你從你自己的線程更新組件(而不是正常的請求線程)時,你應該在應用程序對象上同步 - 因爲你可能會得到'同步'錯誤。

0

的由於Vaadin的工作方式,在服務器端做異步用戶界面的變化不會反映在客戶端上。即使用戶未啓動事務,refresher addon也可以進行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()); 
     } 
    } 
} 
+0

這是可能只有1.1.1版本,它不會與目前的1.2版工作。 – Hunsu 2015-03-21 23:23:47