我在处理过程中使用了第二个线程,并希望从第二个线程更新进度条。但它并不适合我自己。它不会更新进度条,直到我手动点击按钮或在UI上执行服务器事件。
UI.getCurrent().access(new Runnable() {
@Override
public void run() {
//update the UI as in your code above
progressBar_1.setValue(new Float(progress));
Notification.show("Preprocessing - 1 Done");
}
});
答案 0 :(得分:1)
您需要在Vaadin应用程序中启用push:
在项目中为vaadin-push添加依赖项
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-push</artifactId>
<version>${vaadin.version}</version>
</dependency>
定义支持异步通信的servlet,并向UI添加@com.vaadin.annotations.Push
注释:
@Push
public class MyUI extends UI {
@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = PushtestUI.class)
public static class Servlet extends VaadinServlet {
}
@Override
protected void init(VaadinRequest request) {
..
}
}
更多信息,例如here。
此外,必须像在代码中那样正确锁定外部线程对Vaadin组件(或容器)的所有访问。