异步更新vaadin组件

时间:2012-07-19 03:37:44

标签: java multithreading button 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组件?

2 个答案:

答案 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());
        }
    }
}