java - 如何让 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
解决方案
这是通常的生命周期:
- 客户端(浏览器)发生事件,例如单击按钮。
- 这将对服务器(您的 Vaadin 应用程序)进行 HTTP 调用。
- Vaadin 处理调用,在服务器上触发事件,即执行所有已注册的事件侦听器,例如您的点击侦听器。
- 在侦听器中,您对(服务器端)组件进行一些更改,例如更新标签。
- 之后,将向客户端发送一个响应,其中包含有关所有已更改组件的信息。
- 然后,在客户端,更新 HTML 以反映更改的组件。
因此,如果您sleep
在侦听器中执行操作,它只会延迟对客户端的响应。
如果您需要执行由按钮单击触发的昂贵操作,您应该在后台线程中执行此操作,并在操作完成后更新 UI。有关如何从后台线程更新 UI,请参阅文档。
推荐阅读
- docker - docker 卷是 2 路连接吗
- sql-server - 查询被 21 号 spid 阻止 (SQL Server 2014)
- c# - ConfigureAwait 的自定义代码检查
- r - 用该列中的随机值替换数据框中的 NA
- angular - Angular - 添加菜单单击事件组件作为页面,用作另一个组件内的对话框
- html - 链接(指向文件或 www)突然无响应。“ObjectNotFound”“CommandNotFoundException”?
- cmake - 在cmake中使用add_custom_target后如何并行运行makefile?
- mysql - 使用分组和 mySql 排序的输出
- git - 不能 git add 。在新仓库中暂存文件
- java - 在paintComponent中获取组件位置