2012-07-19 108 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