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应用程序(游戏)。为了保持应用程序平稳运行,我尝试将尽可能多的程序逻辑放到一个单独的线程中。然而,我经常遇到一些JavaFXAPI调用需要在JFX应用程序线程中运行的问题。例如,创建一组矩形并为其着色,可以在线程中完成-将它们添加到“组”时,调用.doLayout()和.applycss()需要JFX Appl。线 我还意识到,在JFX应用程序线程中还需要运行“.play()”转换 问题是-如果您没有在正确的线程中执行它-JFX中可能会随机发生“数组超出边界”异

我目前正在尝试开发一个JavaFX应用程序(游戏)。为了保持应用程序平稳运行,我尝试将尽可能多的程序逻辑放到一个单独的线程中。然而,我经常遇到一些JavaFXAPI调用需要在JFX应用程序线程中运行的问题。例如,创建一组矩形并为其着色,可以在线程中完成-将它们添加到“组”时,调用.doLayout()和.applycss()需要JFX Appl。线 我还意识到,在JFX应用程序线程中还需要运行“.play()”转换

问题是-如果您没有在正确的线程中执行它-JFX中可能会随机发生“数组超出边界”异常,而该异常不会指向根本原因。总是很难确定程序和图形逻辑是可以卸载到线程中,还是需要在JFX应用程序线程中运行

有人知道需要在JFX应用程序线程下运行的JavaFX方法调用列表吗

谢谢大家

根据(JavaFX文档中的其他地方也有规定):

必须在JavaFX应用程序线程上创建JavaFX场景和舞台对象,以及修改场景图操作以激活对象(已附加到场景的对象)

因此,您可以在背景线程上创建新节点(例如矩形),并且可以在背景线程上修改它们的属性(例如“为它们着色”),只要它们尚未附加到场景。将节点附加到场景后,必须在FX应用程序线程上对节点进行任何修改

如果将窗格或组附加到场景,则调用
getChildren().add(…)
会修改该窗格/组,因此必须在FX应用程序线程上执行。您引用的其他示例(
layout()
applyCSS()
)仅在相关节点已附加到场景时才有意义。

根据(这也在JavaFX文档的其他位置指定):

必须在JavaFX应用程序线程上创建JavaFX场景和舞台对象,以及修改场景图操作以激活对象(已附加到场景的对象)

因此,您可以在背景线程上创建新节点(例如矩形),并且可以在背景线程上修改它们的属性(例如“为它们着色”),只要它们尚未附加到场景。将节点附加到场景后,必须在FX应用程序线程上对节点进行任何修改


如果将窗格或组附加到场景,则调用
getChildren().add(…)
会修改该窗格/组,因此必须在FX应用程序线程上执行。您引用的其他示例(
layout()
applyCSS()
)仅在相关节点连接到场景时才有意义。

谢谢。这是否也意味着,例如Node.getBoundsInParent().getHeight()需要在JFX appl thread中运行?@Defarine我所看到的任何文档实际上都没有明确回答这个问题(“如果不修改“live”节点属性,是否可以从后台线程访问它们?”)。但是,我认为可以公平地假设,如果没有使修改属性具有线程安全性的同步,那么也没有安全访问属性的同步,因此我会将规则解释为“您应该只从FX应用程序线程访问“活动”节点”@Defarine TBH对于我来说,很难看到任何真正的用例,你希望从背景线程访问节点的高度。谢谢你。这是否也意味着,例如Node.getBoundsInParent().getHeight()需要在JFX appl thread中运行?@Defarine我所看到的任何文档实际上都没有明确回答这个问题(“如果不修改“live”节点属性,是否可以从后台线程访问它们?”)。但是,我认为可以公平地假设,如果没有使修改属性具有线程安全性的同步,那么也没有安全访问属性的同步,因此我会将规则解释为“您应该只从FX应用程序线程访问“活动”节点”@Defarine TBH对于我来说,很难看到任何真正的用例,在这种情况下,您希望从背景线程访问节点的高度。