操作过程中的Vaadin禁用按钮
我怎样才能在瓦丁做到这一点操作过程中的Vaadin禁用按钮,vaadin,vaadin10,Vaadin,Vaadin10,我怎样才能在瓦丁做到这一点 // inside myButton click event myButton.setEnabled(false); doMyActionThatTakeSomeTime(); myButton.setEnabled(true); 在事件内部,该按钮从未被禁用,因为UI未刷新 在Vaadin 11(或10)中这样做的最佳实践是什么 强制视图刷新?(怎么做?) 把我的行动放在一根线里?(怎么做?) 编辑解决方案-如何使其与线程一起工作 到目前为止,使用线程(工作)
// inside myButton click event
myButton.setEnabled(false);
doMyActionThatTakeSomeTime();
myButton.setEnabled(true);
在事件内部,该按钮从未被禁用,因为UI未刷新
在Vaadin 11(或10)中这样做的最佳实践是什么
- 强制视图刷新?(怎么做?)
- 把我的行动放在一根线里?(怎么做?)
domyActionThatTakeSome()
,然后在线程完成后重新启用按钮,服务器推送将确保UI状态正确更新
这是一个经常被问到的话题,这里还有另一个答案:以类似的方式在Vaadin 8和Vaadin 10+中执行异步更新。在Vaadin 8中,有一种方法可以实现这一目的
这可能也应该在新版本中重新引入。更好的方法是:
UI ui = UI.getCurrent();
ui.access( () -> {
// disable button
goButton.setEnabled(false);
ui.push();
doMyActionThatTakeSomeTime();
// enable
goButton.setEnabled(true);
ui.push();
});
对我来说,最简单的方法是:
Button btnAction = new Button("Action");
btnAction.setDisableOnClick(true);
btnAction.addClickListener(e -> {
try {
for (int i = 0; i < 900000; i++) {
System.out.println(i);
}
} finally {
btnAction.setEnabled(true);
}
});
按钮btnAction=新按钮(“操作”);
btnAction.setDisableOnClick(true);
btnAction.addClickListener(e->{
试一试{
对于(int i=0;i<900000;i++){
系统输出打印LN(i);
}
}最后{
btnAction.setEnabled(真);
}
});
是的,这是一个常见的需求,应该很容易实现。Vaadin Button Flow项目中要求的功能。此解决方案仍然存在问题。我松开了自动显示在页面顶部的“挂起栏”,以警告操作正在挂起。当线程运行时,我怎么能让它显示出来呢?实际上你所建议的并不是一个好的解决方案。您有一个长操作域Action that takesomeone();在access()中,这是不好的。这将导致阻塞线程出现问题。access()中运行的操作应仅限于原子UI更新。我认为这样更好,因为我也会自动显示“挂起栏”。我在另一个解决方案中没有得到它(使用线程)。它是否会导致Vaadin引擎本身出现问题?在这种异步任务中,您不应该依赖于框架的“挂起条”。它在长时间等待操作期间显示,例如UI从服务器加载数据时。在您的情况下,它会显示出来,因为您已经锁定了UI。这是一种错误的方式。如果您的操作太长,需要进度指示,则应使用一些UI组件来显示进度,并在access()中定期更新,例如。
Button btnAction = new Button("Action");
btnAction.setDisableOnClick(true);
btnAction.addClickListener(e -> {
try {
for (int i = 0; i < 900000; i++) {
System.out.println(i);
}
} finally {
btnAction.setEnabled(true);
}
});