更新Application Thread之外的JavaFX Live节点

时间:2017-09-22 07:11:32

标签: javafx javafx-8

JavaFX应用程序线程。我能找到的来源说节点上的所有更新都必须在这个帖子中发生。

我正在尝试查找此文档以及此规则是否有任何例外情况。 https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm 正如它所说:

  

JavaFX场景图表示JavaFX应用程序的图形用户界面,它不是线程安全的,只能从UI线程(也称为JavaFX Application线程)访问和修改。

https://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-architecture.htm#A1107438

  

必须从此线程访问任何“实时”场景,它是窗口的一部分。可以在后台线程中创建和操作场景图,但是当其根节点附加到场景中的任何活动对象时,必须从JavaFX应用程序线程访问该场景图。

我经历过,并非所有节点上的更新都必须在JavaFX AT上完成。有些更新节点的调用在这个线程之外工作正常。 例如,更新Text textProperty不需要在JavaFX AT中运行。因此,它看起来既不是设置工具提示,也不是改变可见性/禁用/管理。

JavaFX AT之外的Label textProperty上的更新将抛出

IllegalStateException:不在FX应用程序线程上; currentThread =任务

1 个答案:

答案 0 :(得分:2)

令人困惑的是什么是不允许抛出异常的内容。仅仅因为某些事情没有引发异常并不意味着它被允许,或者它是安全的,或者保证它是有效的。

作为实时场景图的一部分的节点的所有更改必须在JavaFX应用程序线程上发生。

如果违反此规则,JavaFX会尽最大努力抛出异常。检查线程花费时间,对于某些操作,检查线程的性能成本太高,因此并非所有违反规则的行都都会导致异常。但是,即使没有抛出异常,违反规则也会在将来的任意时间出现不一致的行为。有关实践中发生这种情况的示例,请参阅Moving circle randomly disappears (javafx)