Vaadin 在动作期间禁用按钮
Vaadin disable button during an action
我怎样才能在 Vaadin 中实现这个。
// inside myButton click event
myButton.setEnabled(false);
doMyActionThatTakeSomeTime();
myButton.setEnabled(true);
在事件中,按钮永远不会被禁用,因为 UI 没有刷新。
在 Vaadin 11(或 10)中执行此操作的最佳做法是什么?
- 强制刷新视图? (怎么样?)
- 将我的操作放在线程中? (怎么样?)
编辑解决方案 - 如何使其与线程一起工作
到目前为止,Thread 的示例(有效):
@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();
听起来文档中的 "Asynchronous updates" 章节解释了您想要的内容:https://vaadin.com/docs/v11/flow/advanced/tutorial-push-access.html。基本上:运行 doMyActionThatTakeSomeTime()
在单独的后台线程中,然后在线程完成后重新启用按钮,服务器推送将确保 UI 状态正确更新。
这是一个常见问题,这里还有另一个答案:在 Vaadin 8 和 Vaadin 10+ 中以类似的方式进行异步更新。
在 Vaadin 8 中,有一个 Button::setDisableOnClick()
方法可以达到这个目的。
这可能也应该在较新的版本中重新引入。
更好的方法:
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);
}
});
我怎样才能在 Vaadin 中实现这个。
// inside myButton click event
myButton.setEnabled(false);
doMyActionThatTakeSomeTime();
myButton.setEnabled(true);
在事件中,按钮永远不会被禁用,因为 UI 没有刷新。
在 Vaadin 11(或 10)中执行此操作的最佳做法是什么?
- 强制刷新视图? (怎么样?)
- 将我的操作放在线程中? (怎么样?)
编辑解决方案 - 如何使其与线程一起工作
到目前为止,Thread 的示例(有效):
@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();
听起来文档中的 "Asynchronous updates" 章节解释了您想要的内容:https://vaadin.com/docs/v11/flow/advanced/tutorial-push-access.html。基本上:运行 doMyActionThatTakeSomeTime()
在单独的后台线程中,然后在线程完成后重新启用按钮,服务器推送将确保 UI 状态正确更新。
这是一个常见问题,这里还有另一个答案:
在 Vaadin 8 中,有一个 Button::setDisableOnClick()
方法可以达到这个目的。
这可能也应该在较新的版本中重新引入。
更好的方法:
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);
}
});