需要在JavaFX应用程序线程中运行的方法列表?
我目前正在尝试开发一个JavaFX应用程序(游戏)。为了保持应用程序平稳运行,我尝试将尽可能多的程序逻辑放到一个单独的线程中。然而,我经常遇到一些JavaFXAPI调用需要在JFX应用程序线程中运行的问题。例如,创建一组矩形并为其着色,可以在线程中完成-将它们添加到“组”时,调用.doLayout()和.applycss()需要JFX Appl。线 我还意识到,在JFX应用程序线程中还需要运行“.play()”转换 问题是-如果您没有在正确的线程中执行它-JFX中可能会随机发生“数组超出边界”异常,而该异常不会指向根本原因。总是很难确定程序和图形逻辑是可以卸载到线程中,还是需要在JFX应用程序线程中运行 有人知道需要在JFX应用程序线程下运行的JavaFX方法调用列表吗 谢谢大家 根据(JavaFX文档中的其他地方也有规定): 必须在JavaFX应用程序线程上创建JavaFX场景和舞台对象,以及修改场景图操作以激活对象(已附加到场景的对象) 因此,您可以在背景线程上创建新节点(例如矩形),并且可以在背景线程上修改它们的属性(例如“为它们着色”),只要它们尚未附加到场景。将节点附加到场景后,必须在FX应用程序线程上对节点进行任何修改 如果将窗格或组附加到场景,则调用需要在JavaFX应用程序线程中运行的方法列表?,java,multithreading,javafx,Java,Multithreading,Javafx,我目前正在尝试开发一个JavaFX应用程序(游戏)。为了保持应用程序平稳运行,我尝试将尽可能多的程序逻辑放到一个单独的线程中。然而,我经常遇到一些JavaFXAPI调用需要在JFX应用程序线程中运行的问题。例如,创建一组矩形并为其着色,可以在线程中完成-将它们添加到“组”时,调用.doLayout()和.applycss()需要JFX Appl。线 我还意识到,在JFX应用程序线程中还需要运行“.play()”转换 问题是-如果您没有在正确的线程中执行它-JFX中可能会随机发生“数组超出边界”异
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对于我来说,很难看到任何真正的用例,在这种情况下,您希望从背景线程访问节点的高度。