Любые изменения пользовательского интерфейса выполняются после завершения всего обратного обращения к серверу, то есть после того, как кнопки clickListener полностью завершили работу в вашем случае. И поскольку в течение всего прослушивателя кликов пользовательский интерфейс заблокирован, вы даже не можете сделать ui.access
во время прослушивателя кликов, потому что для этого также требуется блокировка пользовательского интерфейса.
Здесь вы можете сделать следующее: позвольте прослушивателю кликов начать новый поток, в котором вы выполняете тяжелую работу. Это означает, что прослушиватель кликов завершает работу очень быстро и поэтому снимает блокировку с пользовательского интерфейса. Теперь мы можем выполнять ui.access(...)
вызовов из фонового потока, который все еще работает.
Вот как будет выглядеть ваш код
@Route("myView")
@Push
public class MyView extends VerticalLayout {
private UI ui;
private Dialog dialog = new Dialog();
public MyView(){
// save the ui instance when the view is attached for later reference
addAttachListener(event -> {
this.ui = event.getUI();
});
add(new Button("some button", click -> start()));
}
private void start(){
new Thread(() -> {
// UI.getCurrent() would return null in a new Thread, that's why we saved the ui instance during attach of the view.
ui.access(() -> dialog.open());
methodInJarTest();
}).start();
}
private void methodInJarTest() {
try {
System.out.println("JAR test - 10 seconds pause");
Thread.sleep(10000);
ui.access(() -> dialog.add(new Span("methodInJar completed")));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Документы: @ Pu sh Асинхронные обновления
В общем, можно сказать, что вы должны выполнять любую задачу, которая может занять некоторое время внутри фонового потока, чтобы избежать блокировки пользовательского интерфейса.