【发布时间】:2019-12-17 17:19:19
【问题描述】:
目前我正在用 Kotlin 和 Java 开发一个桌面应用程序,GUI 是用 JavaFX 制作的。 我有几个基本的 UDP 服务器(Kotlin 线程)监听不同的端口以通过网络接收数据。连接工作正常。
我可以想到几种(或多或少复杂)在线程和 GUI 控制器之间进行通信的方式,但我想知道是否有某种默认方法,我根本不知道.
我正在寻找一种从线程向控制器发送“消息”以更改标签上的某些文本或类似内容的简单方法。
【问题讨论】:
-
docs.oracle.com/javafx/2/threads/jfxpub-threads.htm。您可以做的一件事是绑定属性。您可以做的另一件事是在
Tasksucceeded方法中更新 GUI。最后一个选项是使用Platform.runLater()更新线程中的GUI 节点。我不推荐最后一个,因为如果你错过了什么,你的代码将是不可预测的。 -
FWIW,大多数 GUI 框架都有某种 perform-this-task-later-in-the-GUI-thread(...) 函数,类似于
Platform.runLater()Sedrick 提到的。向另一个方向发送消息,从 GUI 事件处理程序到特定的后台线程,可能更像是自己动手做的事情。 -
最终这是通过
Platform#runLater(Runnable)完成的,正如 Sedrick 和 Solomon 所提到的。可能有更高级别的 API 可以添加抽象层,例如javafx.concurrent.Task。该类具有可以从执行Task的后台线程调用的方法(例如#updateMessage(String)),以更新FX 线程上的属性(它还合并更新以避免淹没FX 线程)——但即使是Task最终使用runLater。由于您使用的是 Kotlin,您可能需要查看 TornadoFX,因为这可能会添加一些方便的 API。 -
哇,感谢您的快速回复。我有一个完全独立的类,它运行线程,它应该更新 GUI。目前我不知道应该如何使用 runLater() 因为我无法从线程类访问相关的 GUI 元素。谁能澄清一下,也许有一个小代码示例。但是绑定可能对我有用...
-
好的,知道了,谢谢。仍然打开:我有一个完全独立的类,它运行线程,它应该更新 GUI。目前我不知道应该如何使用 runLater() 因为我无法从线程类访问相关的 GUI 元素。谁能澄清一下,也许用一个小代码示例。
标签: java multithreading kotlin javafx