操作过程中的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);
        }
    });