【问题标题】:Threading and Binding in JavaFXJavaFX 中的线程和绑定
【发布时间】:2018-06-14 20:14:05
【问题描述】:

我正在尝试为我的 JavaFX 程序运行两个线程。第一个线程(我们将调用线程 1)用于收集来自测距仪传感器和相机的传感器输入。线程 1 更新 StageWithData(继承 Stage 的类)中的变量。然后将该变量绑定到我的第二个 GUI 线程中的标签。使用“绑定”方法形成连接。但是,每当传感器更新时,Java 都会给我一个错误

"Thread-4 javalang.IllegalStateExpression: 不在 FX 应用程序线程上;currentThread = Thread-4"

我明白为什么会发生错误,只是不知道如何解决它。

有什么建议吗?我对线程很陌生。

谢谢!

【问题讨论】:

标签: java multithreading javafx


【解决方案1】:

JavaFX 应用程序都包含至少一个线程,称为“JavaFX 应用程序线程”(JFXAT)。此线程是唯一可以处理应用程序视觉元素更改的线程。

当您创建后台线程时,无法从新线程访问 JFXAT。

后台线程与 JFXAT 交互的唯一方法是将 UI 更新包装在 Platform.runLater() 调用中(只有少数特殊例外)。

在您的后台线程中,这可以通过以下 Lamba 表达式非常简单地完成:

Platform.runLater(() -> {
    // Code to update the UI goes here
});

这实质上是将该代码块发送到正确执行的 JFXAT。

【讨论】:

  • 你知道如何停止一个正在运行任务的线程吗?该任务完成了它的“调用”方法,但该过程似乎仍在运行。 @Zephyr
  • 您需要搜索或将其作为单独的问题发布(但先搜索):)
  • 没关系,我想通了。由于某种原因,我将 Platform.setImplicitExit() 设置为 true。再次感谢
【解决方案2】:

您必须将变量的更新调用封装在 Platform.runLater 调用中,因为这样的更新必须发生在 JavaFX 应用程序线程上,而不能发生在其他线程上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多