我怎么能在Vaadin做到这一点。
// inside myButton click event
myButton.setEnabled(false);
doMyActionThatTakeSomeTime();
myButton.setEnabled(true);在事件内部,该按钮从未被禁用,因为UI没有刷新。
在Vaadin 11 (或10)中这样做的最佳实践是什么?
编辑解决方案-如何使其与线程一起工作
到目前为止,使用线程的示例(工作):
@Push
@Route(value = "secured")
public class MainView extends VerticalLayout
[ ... ]
// inside click event
UI ui = UI.getCurrent();
new Thread(() -> {
ui.access(() -> {
goButton.setEnabled(false);
ui.push();
});
doMyActionThatTakeSomeTime();
ui.access(() -> {
goButton.setEnabled(true);
ui.push();
});
}).start();发布于 2018-09-28 05:22:05
听起来像是文档中的“异步更新”一章解释了您想要的内容:https://vaadin.com/docs/v11/flow/advanced/tutorial-push-access.html。基本上:在单独的后台线程中运行doMyActionThatTakeSomeTime(),然后在线程完成后重新启用按钮,服务器推送将确保UI状态被正确更新。
这是经常被问到的话题,这里还有另一个答案:How to dismiss Vaadin 8 confirmation dialog while performing lengthy operation在Vaadin 8中执行异步更新,而Vaadin 10+以类似的方式工作。
发布于 2018-09-28 05:30:27
在Vaadin 8中,有一个精确的Button::setDisableOnClick()方法。
这可能也应该在新版本中重新引入。
发布于 2019-04-09 21:31:03
对我来说,最简单的方法是:
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);
}
});https://stackoverflow.com/questions/52546381
复制相似问题