代码之家  ›  专栏  ›  技术社区  ›  Tyvain

操作期间禁用按钮

  •  2
  • Tyvain  · 技术社区  · 6 年前

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

    在事件中,按钮从不被禁用,因为UI没有刷新。

    • 强制视图刷新(怎么做?)
    • 把我的行动放在一根线里面(怎么做?)

    编辑解决方案-

    到目前为止,线程(工作)示例:

    @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();
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   Tatu Lund    6 年前

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

    How to dismiss Vaadin 8 confirmation dialog while performing lengthy operation 以类似的方式在vaadin8和vaadin10+中执行异步更新。

        2
  •  2
  •   Basil Bourque    6 年前

    在瓦丁8号,有一个 Button::setDisableOnClick() 方法。

        3
  •  0
  •   Sergio Hilerio    6 年前

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

        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);
            }
        });
    
        4
  •  -1
  •   Tyvain    6 年前

    UI ui = UI.getCurrent();    
    ui.access( () -> { 
        // disable button
        goButton.setEnabled(false);
        ui.push();
    
        doMyActionThatTakeSomeTime();
    
        // enable
        goButton.setEnabled(true);
        ui.push();
        }); 
    
    推荐文章