Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX中的线程和绑定_Java_Multithreading_Javafx - Fatal编程技术网

JavaFX中的线程和绑定

JavaFX中的线程和绑定,java,multithreading,javafx,Java,Multithreading,Javafx,我正在尝试为我的JavaFX程序运行两个线程。第一个线程(我们称之为线程1)用于从测距仪传感器和相机收集传感器输入。线程1更新StageWithData(继承Stage的类)中的变量。然后将该变量绑定到第二个GUI线程中的标签。连接是使用“绑定”方法形成的。但是,每当传感器更新时,Java就会给我一个错误 “Thread-4 javalang.IllegalStateExpression:不在FX应用程序线程上;currentThread=Thread-4” 我理解错误发生的原因,只是不知道如何

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

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

我理解错误发生的原因,只是不知道如何修复它

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


谢谢

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

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

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

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

在后台线程中,使用以下Lamba表达式可以非常简单地完成此操作:

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

这实际上是将代码块发送到JFXAT,并在那里正确执行。

您知道如何停止正在运行任务的线程吗?任务已完成其“调用”方法,但进程似乎仍在运行@Zephyry你会想搜索它或者把它作为一个单独的问题发布(但先搜索):)不管我怎么想。出于某种原因,我将Platform.setImplicitExit()设置为true。再次感谢