当前位置: 首页 > 知识库问答 >
问题:

是否有在应用程序FX线程之外放松JavaFX属性更新规则的计划?

施海
2023-03-14

一个JavaFX表,实现为一个可观察的数组列表,这样当信号值改变时,它们会在GUI上自动更新。

运行改变信号值的循环的模拟引擎。此循环在辅助线程中运行。

我完全知道像选择列表、框中的文本等GUI元素只能在应用程序FX线程中更新。我使用platform.runlater(someRunnableThing)来实现这一点。然而,让我措手不及的是,即使更改一个信号值,也必须在FX线程中完成,否则将引发非应用程序中的FX线程异常。

奇怪的是,尽管有这些异常,应用程序仍然工作得很好,因为最终(对人类观察者来说是瞬时的)更改的值被提取并显示出来。我只是在发布前对运行时行为进行最后检查时才注意到这一点。

工作线程在后台更改变量,而GUI根据更改的变量显示信息,这是一件非常常见的事情。platform.runlater()开销很大,而且有些不确定。由于工作线程不接触GUI,而且应用程序FX线程可以选择在任何时候获取更新,因此Java强制执行这种行为在我看来是严厉的。

我是否错过了一些关于修改观察到的属性的内容?任何想法和想法都很欣赏。

共有1个答案

秦涵涤
2023-03-14

没有关于从后台线程更新JavaFX属性的规则。唯一的规则是,您不能从背景线程更新作为场景图一部分的节点,而且没有计划(可能永远不会)放松这一规则。

您没有发布任何代码,所以我们只能对实际问题进行有根据的猜测。可能发生的情况是,您在后台线程中更改的某个属性(或可观察的集合)上有一个监听器或绑定,其中监听器/绑定正在更新UI。当然,带有可观察项的侦听器(包括通过绑定创建和注册的侦听器)在更改可观察项的同一线程上调用。

所以如果你有像这样的东西

someApplicationProperty.addListener((obs, oldValue, newValue) -> {
    someUIElement.setSomeValue(...);
});
someUIElement.someProperty().bind(someApplicationProperty);
someApplicationProperty.addListener((obs, oldValue, newValue) -> {
    Platform.runLater(() -> someUIElement.setSomeValue(...));
});

换句话说,只要侦听器从FX应用程序线程更新UI,您就可以继续从后台线程更新应用程序属性。

在监听器由UI组件本身注册的情况下,必须确保在UI线程上更改了注册监听器的可观察性。这就是您提到的示例中的情况,例如,更新ListViewTableView的支持列表。您可以直接调用platform.runlater(),或者在模型和UI之间放置一个层。关于后一种方法,请参见从后台线程更新可观察列表的正确方法

也可以查看http://www.oracle.com/technetwork/articles/java/javafxinteg-2062777.html

 类似资料:
  • JavaFX场景图表示JavaFX应用程序的图形用户界面,它不是线程安全的,只能从UI线程(也称为JavaFX应用程序线程)访问和修改。 https://docs.oracle.com/javase/8/javafx/get-start-tutorial/jfx-architecture.htm#A1107438 任何“实时”场景,即作为窗口一部分的场景,都必须从该线程访问。场景图可以在后台线程中

  • 问题内容: 我正在用这个 但是这个: 给我这个错误: 而且我真的不明白怎么了 问题答案: 可能是因为您误解了工作原理。 正确的代码段为: 但: 我强烈建议您不要使用,而是使用!它是JavaFX API的一部分,您不必执行这些调用。这只是很快就被黑了,但是您知道了:

  • 问题内容: 我试图通过使用JInternalFrame附加JFXPanel来使用JavaFx 2.x和Swing应用程序 我的代码如下 我有这个例外 就我的目的而言,我必须使用JInternalFrame:如何解决此问题? 问题答案: 请参阅“ Swing中的JavaFX”教程。您正在执行应在Swing线程(事件调度线程)上的JavaFX线程上运行的JavaFX操作。 幸运的是,他们从以前的错误中

  • 我正试图通过使用一个JInternalFrame来使用JavaFx2.x和Swing应用程序,其中附加了一个JFXPanel 我在下面的代码 我有这个例外 对于我的目的,我必须使用JInternalFrame:我如何解决这个问题?

  • 下面的代码片段给我错误< code >不在FX应用程序线程上;当前线程 = < code > Java FX < code >应用程序线程。这个应用程序在java 1.7中运行良好,但是当我把它移到fx8时,它现在出现错误。当我第一次尝试启动应用程序时,它按预期工作。但是在关闭并再次打开舞台后,它不起作用了。 错误也不明确。如果当前线程是fx应用程序线程,那么不在fx应用线程上意味着什么。

  • 我有一个列出用户朋友的表格视图,我需要每5秒更新一次从数据库中检索的数据。 这是我使用的代码: 外汇控制器: 是数据库模型。是用于表行的对象。 然而,我在第