如何从我自己的线程安全地修改 JavaFX GUI 节点?

2024-05-04

我尝试更改线程中的 JavaFX GUI 节点,但看到以下错误:

线程“Thread-8”中的异常 java.lang.IllegalStateException:不存在 FX应用线程;当前线程 = 线程 8

生成错误的示例代码:

public class Controller { 
  public Label label = new Label();

  public void load() {
    MyThread myThread = new MyThread();
    myThread.start();
  }

  public class MyThread extends Thread {
    public void run() {
      ......
      label.setText(""); // IllegalStateException: Not on FX application thread
    }
  }
}

活动场景图中 JavaFX 节点的所有操作都必须在 JavaFX 应用程序线程上运行,否则您的程序可能无法正常工作。

JavaFX 将抛出异常IllegalStateException: Not on FX application thread当您尝试在 JavaFX 应用程序线程之外修改场景图节点的属性时。即使您没有收到 IllegalStateException,您也不应该在 JavaFX 应用程序线程之外修改场景图节点,因为如果您这样做,您的代码可能会意外失败。

Using Platform.runLater()

将操作场景图节点的代码包装在平台.runLater https://openjfx.io/javadoc/17/javafx.graphics/javafx/application/Platform.html#runLater(java.lang.Runnable)调用以允许 JavaFX 系统在 JavaFX 应用程序线程上运行代码。

例如,您可以使用以下代码修复示例程序:

Platform.runLater(() -> label.setText(""));

替代方案使用Task with a message财产

如果您使用的是 JavaFXTask https://openjfx.io/javadoc/17/javafx.graphics/javafx/concurrent/Task.html,它对使用 JavaFX 的并发编程有一些内置支持,那么您可以利用它的优势message https://openjfx.io/javadoc/17/javafx.graphics/javafx/concurrent/Task.html#updateMessage(java.lang.String)属性,可以从任何线程安全地更新,但只会在 JavaFX 线程上中继属性更改。

这是一个示例(来自任务 javadoc):

Task<Integer> task = new Task<Integer>() {
    @Override protected Integer call() throws Exception {
        int iterations;
        for (iterations = 0; iterations < 10000000; iterations++) {
            if (isCancelled()) {
                updateMessage("Cancelled");
                break;
            }
            updateMessage("Iteration " + iterations);
            updateProgress(iterations, 10000000);
        }
        return iterations;
    }
}; 

然后,您可以安全地绑定到消息属性,以使更改的消息值反映在 UI 中:

Label iterationLabel = new Label();
iterationLabel.textProperty().bind(
    task.messageProperty()
);

updateMessage https://openjfx.io/javadoc/17/javafx.graphics/javafx/concurrent/Task.html#updateMessage(java.lang.String)javadoc:

更新消息属性。对 updateMessage 的调用被合并并且 稍后在 FX 应用程序线程上运行,因此调用 updateMessage, 即使来自 FX 应用程序线程,也不一定会导致 立即更新此属性和中间消息值 可以合并以节省事件通知。

这个方法是安全的 从任何线程调用。

有很多使用的例子updateMessage() in the Taskjavadoc。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从我自己的线程安全地修改 JavaFX GUI 节点? 的相关文章

  • numba 函数何时编译?

    我正在研究这个例子 http numba pydata org numba doc 0 15 1 examples html multi threading http numba pydata org numba doc 0 15 1 ex
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 将暂停屏幕绘制为播放屏幕上的一层 -LibGdx

    在我的 LibGdx 游戏中 我创建了暂停功能 在玩游戏时 如果我按下暂停按钮 则会显示一个带有恢复按钮的单独屏幕 实际上我想做的是暂停屏幕应该像一层一样出现在游戏屏幕上方 就像下面的游戏截图一样 我只能在我的游戏中使用单独的背景和所有内容
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • .NET 紧凑框架中的信号量

    不幸的是 使用 NET Compact Framework 时 System Threading 中没有信号量 我不确定为什么会这样 有人有想法吗 经过谷歌搜索后 我发现很多人给出了他们自己的实现 但他们中没有一个真正工作得很好 或者根本没
  • Java NoSuchMethodException - 类中确实存在方法

    我正在构建一个 JavaFx 应用程序 我想创建一个接收 GridPane 和 Node 以及添加到窗格中的项目数量的方法 但是 当我调用该方法时 我收到 NoSuchMethodException 作为测试 我尝试创建一个简单的方法pri
  • Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

    以下项目有不同的目标 但我很有趣知道它们如何 暂停 问题 Thread sleep 它会影响系统性能吗 它是否会占用线程的等待时间 关于什么Monitor Wait 他们 等待 的方式有何不同 他们的等待会占用一个线程吗 关于什么Regis
  • 冻结/挂起 tkinter GUI 等待线程完成

    按下按钮后我的界面冻结了 我正在使用线程 但我不确定为什么仍然挂起 任何帮助将不胜感激 提前致谢 class magic def init self self mainQueue queue Queue def addItem self q
  • 触摸屏上最小的按钮尺寸

    我参与为医疗设备编写触摸屏应用程序 该程序类似于信息亭 因为用户无法访问开始菜单等 并且用户将使用屏幕键盘在他们需要的罕见情况下键入任何文本 规格屏幕尺寸为 1280x1024 问题是 一个合理的界面的最小可触摸按钮尺寸是多少 我认为美国一
  • 在生产者-消费者情况下使用条件变量

    我正在尝试了解条件变量以及如何在生产者 消费者情况下使用它 我有一个队列 其中一个线程将数字推入队列 而另一个线程从队列中弹出数字 当生产线程放置一些数据时 我想使用条件变量向消费线程发出信号 问题是有时 或大多数时候 它只将最多两个项目推
  • 替换主窗口中的 CentralWidget

    我对 PySide 有点陌生 我有一个主窗口对象 一次显示一个小部件 我一直在尝试更改中央小部件QMainWindow类 以便在按下按钮时替换窗口中可见的小部件 问题是按下的按钮是在 Widget 类中 而不是在主窗口类中 say clas
  • Visual Studio 2010 的“线程”窗口中的 和 [Thread Destroyed] 详细信息

    我一直在尝试调试与一个应用程序的线程相关的一些问题 当我附加到应用程序时 我看到一个像这样的窗口 这个名为 Thread Destroyed 的线程是什么 应用程序代码肯定不会写这个名称 这意味着线程的调用堆栈不可用 采集引擎 线程在应用程
  • document.ready 之前的 Jquery UI 界面看起来很难看

    HTML 元素在 onload 或 document ready 被触发之前显示 所有 jQuery UI 小部件都在 document ready 上加载 这使得页面在最初几秒钟看起来很难看 处理它的可能选项 在使用 jQuery UI
  • 是否可以在Java中检查CPU是否是超线程的?

    我想知道可以运行的最佳线程数 通常 这等于Runtime getRuntime availableProcessors 但是 在支持超线程的 CPU 上 返回的数字是其两倍 现在 对于某些任务来说 超线程是好的 但对于其他任务来说 它没有任
  • 在 JavaFX 中拖动未装饰的舞台

    我希望将舞台设置为 未装饰 使其可拖动且可最小化 问题是我找不到这样做的方法 因为我遇到的示例是通过插入到主方法中的方法来实现的 我想通过控制器类中声明的方法来完成此操作 就像我如何使用下面的 WindowClose 方法来完成此操作 这是
  • Python `concurrent.futures`:根据完成顺序迭代 future

    我想要类似的东西executor map 除了当我迭代结果时 我想根据完成的顺序迭代它们 例如首先完成的工作项应该首先出现在迭代中 等等 这样 当且仅当序列中的每个工作项尚未完成时 迭代就会阻塞 我知道如何使用队列自己实现这一点 但我想知道
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • Java,如何管理线程读取socket(websocket)?

    我有一个 WebSocket 服务器 我的服务器创建一个新线程来处理新连接 该线程一直处于活动状态 直到 websocket 中断 我的问题 对于 1 000 000 个连接 我需要 1 000 000 个线程 我如何通过一个线程处理多个

随机推荐

  • 使用 Mockito 对 Runnable 进行单元测试

    我有这样的代码 我想为其编写单元测试 public class TestClass private final Executor executor private final Handler handler TestClass Execut
  • Jetpack Compose 中的自定义 Toast

    我想要在 Jetpack Compose 中自定义 Toast 但没有找到任何与此相关的有用文档 如有任何帮助 我们将不胜感激 自定义 Toast 已被弃用 取而代之的是 SnackBar 因此 他们大多不会获得 Jetpack Compo
  • PL/pgSQL 中的 EXPLAIN ANALYZE 给出错误:“查询没有结果数据的目的地”

    我试图理解 PL pgSQL 函数中 select 语句的查询计划 但我不断收到错误 我的问题 如何获取查询计划 以下是重现该问题的简单案例 相关表名为 test table CREATE TABLE test table name cha
  • 将 erlang shell 作为守护进程/服务运行

    显然 我有一个在 Erlang shell 中运行的 Erlang 程序 我想监视它 这就是我要的 当机器启动时 Erlang shell 应该随之启动 并且在 shell 中运行的程序也应该随之启动 如果 Erlang shell 由于某
  • ActionDispatch::Http::UploadedFile.content_type 在 Rspec 测试中未初始化

    背景 我有一个Book模型与一个cover file通过我的 Rails 控制器之一使用上传的文件设置的属性 我正在使用 Rails v4 0 4 Goal 我想测试是否仅保存具有特定内容类型的文件 我计划创建 Rspec 测试示例Acti
  • Lucene外来字符问题

    我在使用 Zend Lucene 和 等外来字符时遇到了一些严重的问题 这些问题在创建索引和查询索引时都会出现 我已经尝试过 iso 8859 1 和 utf 8 ISO 8859 1 不起作用的查询看起来像 area sk ne 使用 Z
  • 在长时间运行期间发送 Windows 消息?

    我在运行的大型操作中收到以下消息 CLR 无法转换 从 COM 上下文 0x1fe458 到 COM 上下文 0x1fe5c8 60 秒 这 拥有目的地的线程 上下文 公寓最有可能 要么进行非抽水等待 要么 处理很长时间的运行 无需泵送 W
  • 从后台线程更新可观察列表的正确方法

    我正在尝试遵循 MVC 进行测试项目 因此我的模型应该完全独立于我的观点 但是我不确定应该如何更新在后台线程中更新的可观察列表 正在给出有关上传的字符串 文件 以便消息显示在 UI 上的 ListView 中 我正在使用 JavaFX 并尝
  • 优化Python:大数组、内存问题

    我在运行 python numypy 代码时遇到速度问题 我不知道如何让它更快 也许其他人 假设有一个表面有两个三角剖分 一个是细三角剖分 fine 有 M 个点 一个是粗剖分 有 N 个点 此外 还有每个点的粗网格数据 N 个浮点数 我正
  • 在 Spring 5 Webflux 中启用 CORS?

    如何启用CORS在 Spring 5 Webflux 项目中 我找不到任何合适的文档 我使用这个自定义过滤器取得了成功 import org springframework context annotation Bean import or
  • 在两个应用程序之间通过 url 方案快速传递数据?

    有两个测试应用程序称为发送者和接收者 他们通过 UrlScheme 相互通信 我想从发送者发送一个字符串到接收者 这可能吗 关于字符串的详细信息 我都在发送者和接收者中创建文本字段 我会在发送者文本字段上发送一些字符串 当我单击按钮时 字符
  • '||=' 运算符在 ruby​​ 中起什么作用? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Ruby 中是什么意思 https stackoverflow com questions 995593 what does mean in ruby 我是红宝石新手 我看到这里的答案之一使用了它
  • 跨多个子域的 WebAuthn

    我正在尝试在我的网站上设置 WebAuthn 身份验证流程 但遇到了问题 我希望我的用户能够在主网站 www domain com 上注册他们的设备 以便可以通过用户设置轻松访问 身份验证本身通过 IdP sso domain com 在不
  • C 程序的“编译器正确”命令

    这是关于中提到的编译步骤Linux 期刊文章 https www linuxjournal com article 6463 C 程序是使用编译的cpp cc1 as and ld该文章中的命令 我能够执行这些步骤cpp as and ld
  • 一个好的 Java VM 中方法调用的开销是多少?

    有人可以提供反汇编的机器代码汇编程序列表吗 我的意思是 与 C 中的普通函数调用相比 肯定有一些开销 VM 需要跟踪调用以查找热点 并且当它使用编译代码时 如果新加载的类需要重新编译 它需要提供动态更改编译方法的方法 我想某处也有返回堆栈溢
  • 如何安装 php 5.3.14 ubuntu 12.10

    我必须在我的 ubuntu 12 10 上安装这个特定版本才能与提供商保持兼容 我可以使用 synaptic 轻松安装 php 5 3 10 但无法升级到 5 3 14 我怎样才能做到这一点 apt get 不起作用 我在网上看到了几个教程
  • 用户评级的 ER 模型

    我有很多 用户 每个用户最多有 5 个 服务 用户应该能够对每项服务进行评分 0 5 我还想保留用户的平均评分 这是我的想法 但是还有更好的方法吗 User id user name dob 服务 固定数量的服务 id service de
  • Swift - 以编程方式刷新约束

    我的 VC 开头为stackView附有Align Bottom to Safe Area 我有 tabBar 但一开始是隐藏的tabBar isHidden true 稍后 当 tabBar 出现时 它会隐藏stackView 所以我需要
  • 使用 Python 发布 XML 文件

    我是 Python 新手 需要一些帮助 我的目标是向 URL 发送一些带有 post 请求的 XML 这将触发发送 SMS 我有一个小的 XML 文档 我想将其发布到 URL 我可以在需要发布的 python 代码中引用我的服务器上的 XM
  • 如何从我自己的线程安全地修改 JavaFX GUI 节点?

    我尝试更改线程中的 JavaFX GUI 节点 但看到以下错误 线程 Thread 8 中的异常 java lang IllegalStateException 不存在 FX应用线程 当前线程 线程 8 生成错误的示例代码 public c