我有这个代码每隔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组件?
答案 0 :(得分:1)
可以找到对问题进行相当全面的讨论,并找到各种解决方案here; Redux:'vanilla'Vaadin只是遵循用户发起的请求 - 响应范例。
您需要使用加载项从服务器启动浏览器中的更改。
除此之外:您应该在更新自己的线程中的组件时(而不是正常的请求线程)同步应用程序对象 - 因为您可能会遇到“同步”错误。
答案 1 :(得分:0)
由于Vaadin的工作方式,在服务器端进行的异步UI更改不会反映在客户端上。即使用户没有开始交易,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());
}
}
}