在哪个线程上执行 JavaFX 更改侦听器?
On which thread JavaFX change listeners are executed ?
在以下文档更改侦听器中添加的代码是否将始终在 JavaFX 应用程序线程中执行?
webEngineObject.documentProperty().addListener(new ChangeListener<Document>(){
@Override
public void changed(
ObservableValue<? extends Document> arg0,
Document arg1, Document arg2) {
//some code here
}
});
或者我需要添加 Platform.runLater() ?
当我在遇到断点后查看线程堆栈时,看起来代码是在 JavaFX 应用程序线程本身中执行的,但我想确认一下,因为在文档中找不到与此相关的任何评论。任何 link 提到这一点的文档都会非常有帮助。
是的,代码在 JFX-Thread 上运行。
JavaFx Architecture Documentation 查看章节 "Glass Windowing Toolkit -> Threads"
一般来说,在进行更改的同一线程上更改侦听器 运行。当然,可能有 Property
或 ObservableValue
的实现,它们在另一个线程上调用侦听器,但据我所知,没有具有此行为的默认实现。
所以简单的答案是 - 更改侦听器将 运行 在执行原始更改的任何线程上。
也就是说,如果 属性 与 JavaFX 节点相关,则应该在 JavaFX 线程上调用原始更改以防止 "Not on FX application thread" 异常。
在以下文档更改侦听器中添加的代码是否将始终在 JavaFX 应用程序线程中执行?
webEngineObject.documentProperty().addListener(new ChangeListener<Document>(){
@Override
public void changed(
ObservableValue<? extends Document> arg0,
Document arg1, Document arg2) {
//some code here
}
});
或者我需要添加 Platform.runLater() ?
当我在遇到断点后查看线程堆栈时,看起来代码是在 JavaFX 应用程序线程本身中执行的,但我想确认一下,因为在文档中找不到与此相关的任何评论。任何 link 提到这一点的文档都会非常有帮助。
是的,代码在 JFX-Thread 上运行。
JavaFx Architecture Documentation 查看章节 "Glass Windowing Toolkit -> Threads"
一般来说,在进行更改的同一线程上更改侦听器 运行。当然,可能有 Property
或 ObservableValue
的实现,它们在另一个线程上调用侦听器,但据我所知,没有具有此行为的默认实现。
所以简单的答案是 - 更改侦听器将 运行 在执行原始更改的任何线程上。
也就是说,如果 属性 与 JavaFX 节点相关,则应该在 JavaFX 线程上调用原始更改以防止 "Not on FX application thread" 异常。