异步更新vaadin组件

我有这个代码每隔3秒更新一次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组件?

有一个名为ICEPush的插件,它完全符合我的需要。

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

可以在这里找到对问题的相当全面的讨论,以及各种解决方案; Redux:’vanilla’Vaadin只是遵循用户发起的请求 – 响应范例。

您需要使用加载项从服务器启动浏览器中的更改。

另外:在从您自己的线程更新组件时(而不是正常的请求线程),您应该在应用程序对象上进行同步 – 因为您可能会遇到“同步”错误。

由于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()); } } }