操作期间Vaadin禁用按钮

时间:2018-09-27 23:31:49

标签: vaadin vaadin10

我该如何在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();

4 个答案:

答案 0 :(得分:4)

类似文档中“异步更新”一章的声音解释了您想要的内容:https://vaadin.com/docs/v11/flow/advanced/tutorial-push-access.html。基本上:在单独的后台线程中运行doMyActionThatTakeSomeTime(),然后在线程完成后重新启用按钮,并且Server Push将确保正确更新UI状态。

这是一个经常问到的话题,这里还有另一个答案:How to dismiss Vaadin 8 confirmation dialog while performing lengthy operation在Vaadin 8和Vaadin 10+中以类似的方式进行异步更新。

答案 1 :(得分:1)

在Vaadin 8中,有一种Button::setDisableOnClick()方法可以达到这个目的。

在新版本中也应该重新引入。

答案 2 :(得分:0)

对我来说,最简单的方法是:

    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);
        }
    });

答案 3 :(得分:-1)

一种更好的方法:

UI ui = UI.getCurrent();    
ui.access( () -> { 
    // disable button
    goButton.setEnabled(false);
    ui.push();

    doMyActionThatTakeSomeTime();

    // enable
    goButton.setEnabled(true);
    ui.push();
    });