Asynchronously update vaadin components

2019-04-12 04:19发布

I have this code for updating vaadin button's caption every 3 seconds.

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);

However, it can't change button's caption although it is executed every 3 seconds(judging by the log file). How can I access vaadin's GUI components from another thread?

3条回答
姐就是有狂的资本
2楼-- · 2019-04-12 04:46

Because of the way Vaadin works, asynchronous UI changes made on the server side are not reflected on the client. The refresher addon makes it possible to make UI changes, even if the user does not start a transaction.

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());
        }
    }
}
查看更多
做个烂人
3楼-- · 2019-04-12 04:58

A reasonably comprehensive discussion of the problem, and the various solutions can be found here; Redux: 'vanilla' Vaadin simply follows a user initiated request-response paradigm.

You'll need to use an add-on to initiate changes in the browser from the server.

Aside : you should synchronize on the application object when updating components from your own threads (as opposed to the normal request thread) - as you may get 'Sync' errors.

查看更多
可以哭但决不认输i
4楼-- · 2019-04-12 05:05

There's an addon named ICEPush which does exactly what I needed.

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

查看更多
登录 后发表回答