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

如何使vaadin 10组件从单击事件逐个更改?

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

    由于某些原因,组件总是从同时单击按钮更改。
    我需要一个接一个地更换它们。示例如下:

    countButton.addClickListener(buttonClickEvent -> {
        int input = Integer.parseInt(inputTextField.getValue());
    
        long factorialResult = countFactorial(input);
        resultFactorialLabel.setText("Factorial: " + factorialResult);
    
        //just for example, could be processing that takes really long
        try {
            sleep(1000);
        } catch (InterruptedException ignored) {
        }
    
        int fibonacciResult = countFibonacci(input);
        resultFibonacciLabel.setText("Fibonacci: " + fibonacciResult);
    });
    

    当我运行-10秒后,结果factorallabel和resultfibonaccialabel同时更改,当我希望更改resultfactorallabel时,在10秒后,resultfibonaccialabel将被更改。我该怎么做?
    如何使标签同时改变?

    Vaadin版本:10.0.1

    1 回复  |  直到 6 年前
        1
  •  2
  •   Steffen Harbich    6 年前

    这是通常的生命周期:

    • 在客户端(浏览器)发生事件,例如单击按钮。
    • 这将对服务器(您的vaadin应用程序)进行HTTP调用。
    • Vaadin处理调用,在服务器上触发事件,即为事件执行所有注册的侦听器,例如单击侦听器。
    • 在侦听器中,您对(服务器端)组件进行了一些更改,例如更新标签。
    • 之后,将向客户机发送一个包含所有更改组件的信息的响应。
    • 然后,在客户端,更新HTML以反映更改的组件。

    所以如果你做了 sleep 在您的侦听器中,它只会延迟对客户机的响应。

    如果需要执行由按钮单击触发的昂贵操作,则应在后台线程中执行,并在操作完成后更新UI。见 docs 有关如何从后台线程更新UI的信息。