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?
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.
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.
There's an addon named ICEPush which does exactly what I needed.
https://vaadin.com/directory#addon/icepush