异步更新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的插件,它完全符合我的需要。
可以在这里找到对问题的相当全面的讨论,以及各种解决方案; 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()); } } }