java - 如何让Vaadin 10组件根据点击事件一一改变?

标签 java concurrency vaadin

由于某种原因,组件总是通过同时单击按钮而更改。
我需要将它们一一更改。这是示例:

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

最佳答案

这是通常的生命周期:

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

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

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

关于java - 如何让Vaadin 10组件根据点击事件一一改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51534136/

相关文章:

java - Selenium waitForPageToLoad 结束条件

当资源位于不可关闭包装器内时,Java try-with-resource

concurrency - Centos 7 : Running "Grunt Serve" (concurrent) task 上的 Ionic "concurrent:server"错误

javascript - 如何在 Node.js 中使用传入的函数初始化子进程

spring - UI.getCurrent 在 Spring Managed Bean 中返回 Null

java - vaadin 中的数据库表更新

java - 如何在spring-mvc中的同一个jsp页面的同一个 Controller 上创建两个操作

java - 将字符串拆分为特定大小的 String[]

java - 延迟对对象的调用而不强制当前线程 hibernate

json - 升级到 7.5.3 后 Vaadin 无法解析其安全 key