目前我使用 Kotlin 和 Java 开发桌面应用程序,GUI 是使用 JavaFX 制作的。
我有几个基本的 UDP 服务器(Kotlin 线程)监听不同的端口以通过网络接收数据。连接工作正常。
我可以想到几种(或多或少复杂的)线程和 GUI 控制器之间通信的方法,但我想知道是否有某种我根本不知道的默认方法。
我正在寻找一种简单的方法,将“消息”从线程发送到控制器,以便更改标签上的某些文本或类似的内容。
Use Platform.runLater
当不在 JavaFX 线程上时,使用Platform.runLater调用最终更新 GUI 的方法。
这样做将调度包含在中的代码runLater
稍后在 JavaFX 应用程序线程上执行。
由于 JavaFX 系统被设计为单线程系统,因此这是使系统一致工作所必需的。
JavaFX 中更高级别的并发支持
JavaFX 还有更高级别的并发支持使用诸如Task通过以下方法提供一些通信支持updateMessage。在任务内的实现级别,updateMessage
只是使用Platform.runLater
内部,但在其实现中包含一些额外的优化,以使其使用简单且高效。
通常,Tasks 和 Platform.runLater 有不同的(有时是互补的)焦点,请参阅Javafx:javafx.concurrent 和 Platform.runLater 之间的区别?.
特别是,对于 UDP 服务器在多个端口上侦听并将信息反馈给 GUI 的要求,可能会调用runLater
直接是比使用 JavaFX 任务更合适的解决方案。
附加问题的答案
但是绑定可能适用于我的情况
不要使用绑定、修改属性或从另一个线程触发更改侦听器而不将调用包装在Platform.runLater
call.
绑定和更改侦听器不适用于多线程环境(例如,如果您同时修改不同线程上的绑定或更改侦听器,结果可能是不可预测的)。另外,如果您的绑定或更改侦听器最终触发 JavaFX 应用程序线程对活动场景图的更改,则结果可能再次无法预测,因为场景图并非设计用于以这种方式使用。
目前我不知道应该如何使用 runLater(),因为我无法从线程类访问相关的 GUI 元素。
一些不同的选择:
- 向线程类提供对 GUI 元素的访问,因此它可以在
runLater
致电(这是对您的设计修改)或
- 让线程类调用另一个类上的方法(通过
runLater
)它确实了解 GUI 元素并可以进行适当的更改或
- 使用具有可观察属性的共享模型类,您已将其附加到已建立绑定或更改侦听器的控制器类,以根据属性的更改来更新 UI。从你的线程你应该read(有关从 GUI 线程到另一个线程进行通信的方法,请参阅链接)并使用将可观察属性写入共享模型类
runLater
.
正如你所看到的,在所有情况下,最终runLater
用于调度涉及稍后在 JavaFX 线程上运行的 GUI 的工作,以强制系统内的线程安全。在所有情况下,如果您无法直接访问 GUI 元素,则需要与可以直接访问 GUI 元素的东西进行通信,以便它可以代表您进行任何必要的修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)