2

我怎样才能在 Vaadin 中实现这一点。

// inside myButton click event
myButton.setEnabled(false);
doMyActionThatTakeSomeTime();
myButton.setEnabled(true);

在事件内部,该按钮永远不会被禁用,因为 UI 不会刷新。

在 Vaadin 11(或 10)中执行此操作的最佳实践是什么?

  • 强制视图刷新?(如何?)
  • 把我的动作放在一个线程里面?(如何 ?)

编辑解决方案 -如何使其与 Thread 一起使用

到目前为止,以 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();
4

4 回答 4

4

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

这是一个经常被问到的话题,这里还有另一个答案:如何在执行冗长的操作时关闭 Vaadin 8 确认对话框在 Vaadin 8 和 Vaadin 10+ 中以类似的方式进行异步更新。

于 2018-09-28T05:22:05.443 回答
2

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

这可能也应该在较新的版本中重新引入。

于 2018-09-28T05:30:27.557 回答
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);
        }
    });
于 2019-04-09T21:31:03.967 回答
-1

一种更好的方法:

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

    doMyActionThatTakeSomeTime();

    // enable
    goButton.setEnabled(true);
    ui.push();
    }); 
于 2018-10-01T21:04:36.453 回答