首页 > 解决方案 > 如何让 Vaadin 10 组件从点击事件中一一变化?

问题描述

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

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 秒过去了,然后 resultFactorialLabel 和 resultFibonacciLabel 同时改变,当我想要改变 resultFactorialLabel 时,然后在 10 秒内改变 resultFibonacciLabel。我该怎么做?
它是如何做到的,标签同时发生变化?

Vaadin 版本:10.0.1

标签: javaconcurrencyvaadin

解决方案


这是通常的生命周期:

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

因此,如果您sleep在侦听器中执行操作,它只会延迟对客户端的响应。

如果您需要执行由按钮单击触发的昂贵操作,您应该在后台线程中执行此操作,并在操作完成后更新 UI。有关如何从后台线程更新 UI,请参阅文档。


推荐阅读