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

更新应用程序线程外的JavaFX活动节点

丁景山
2023-03-14

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

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

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

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

共有1个答案

裴楚青
2023-03-14

您混淆了什么是不允许的,什么是抛出异常的。仅仅因为某些东西没有抛出异常,并不意味着它是允许的,或者它是安全的,或者它是保证工作的。

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

如果违反此规则,JavaFX将尽最大努力抛出异常。检查线程需要花费时间,而且对于某些操作来说,检查线程的性能代价太高,因此不是所有违反规则的行为都会导致异常。但是,违反该规则很容易在将来任意时间出现不一致的行为,即使没有抛出异常。请参阅Moving circle Randome Discounces(javafx)以获得一个在实践中发生的示例。

 类似资料:
  • 我正在尝试开发一个应用程序,它应该能够运行在只有CLI的环境中,以及在启用GUI的模式下。由于我的一些工作是由Jav FX线程完成的,所以我需要在不启动图形引擎的情况下启动JavaFX主线程,因为这在只使用CLI的环境中会崩溃。我该怎么做?我已经编写了第一个主类,它将使用命令行参数来决定GUI是否将被启动或者它应该在CLI模式下运行。GUI已经工作了,我只需要弄清楚如何在另一个类中运行没有GUI的

  • 我即将编写一个新的跨平台应用程序,我选择JavaFX,主要是因为它丰富的UI库(包括标准的和第三方的)和它本机的数据绑定特性。我的应用程序将通过原生打包来部署,这既是因为缺乏PPAPI Java插件(Chrome将在Chrome42中停止NPAPI,现在处于测试阶段),这将阻止使用Chrome的用户使用WebStart,也是因为更“经典”的用户体验,所以WebStart和自动更新是不可能的。 情况

  • 在过去的几天里,我一直在尝试JavaFX、FXML、任务和属性。我偶然发现了一种奇怪的行为,希望您能帮助我更好地理解正在发生的事情。 我有一个极简的GUI,看起来像这样:GUI 如果我单击按钮,就会创建并启动一个新任务。此任务会增加一个双属性,并且新值会写入标签并在ProgressBar中设置。任务代码可以在这里看到: FXML控制器的代码如下: 如果我运行此代码,尝试更新标签会导致以下异常:ja

  • 问题内容: 我同时使用Javafx和线程,并且遇到了这个问题,我制作了一个按钮,然后单击该按钮(使用事件处理程序)时,我做了一个for循环,将按钮更改为1,2,3,4 ,5,然后在每个中间延迟一秒钟。像倒计时! 但是发生的事情是延迟了5秒钟,并将按钮的文本更改为5。 问题是我希望看到它在1到5之间变化,但我看到的只是在5秒延迟结束时为5。我认为它会更改按钮文本,但看不到。我可能与类中的方法有关。

  • 我同时使用Javafx和线程,我经常遇到这个问题,我制作了一个按钮,然后当单击按钮时(使用事件处理程序),我制作了一个for循环,将按钮更改为1、2、3、4、5,然后在每个按钮中间延迟一秒钟。就像倒计时一样! 但实际情况是,它会延迟5秒钟,并将按钮的文本更改为5。 问题是我想看到它在1到5之间变化,但我看到的只是5秒延迟结束时的5。我假设它会更改按钮文本,但我看不到它。我可能不得不处理<代码>。在

  • 有多种方法可以更新Electron应用. 最简单并且获得官方支持的方法是利用内置的Squirrel框架和Electron的autoUpdater模块。 Updating Applications There are several ways to update an Electron application. The easiest and officially supported one is