java.lang.IllegalStateException: Not on FX application thread

关于JavaFx异常:Not on FX application thread Hello,大家好。我是 78KgMiao。 相信很多使用JavaFx的小伙伴都遇到过这个问题。Not on FX application thread;造成这个问题的原因呢,就是没有在JavaFx的UI线程中绘制。 不管是JavaSwing也好,JavaFx也罢。都会把UI绘制放到一个独立的线程中。避免其他线程去刷新UI。如果说外部线程可以绘制UI的话,那不就乱套了吗。 代码案例 package com.beishu.clip.text; import javafx.application.Applic 阅读详情
  • 问题描述

运行javaFX程序,系统会自动创建一个FX application thread线程,用于更新界面的组件信息,例如ListView的items、Label的text。当我们想运用多线程实现业务,而自己创建的线程又直接导致了界面组件信息的更新时,控制台就会抛出java.lang.IllegalStateException异常。

完整异常栈如下
Exception in thread “pool-2-thread-1” java.lang.IllegalStateException: Not on FX application thread; currentThread = pool-2-thread-1
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:279)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
at javafx.scene.Parent2.onProposedChange(Parent.java:367)atcom.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:113)atcom.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108)atcom.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:575)atcom.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(LabeledSkinBase.java:204)atcom.sun.javafx.scene.control.skin.LabelSkin.handleControlPropertyChanged(LabelSkin.java:49)atcom.sun.javafx.scene.control.skin.BehaviorSkinBase.lambda2.onProposedChange(Parent.java:367) at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:113) at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108) at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:575) at com.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(LabeledSkinBase.java:204) at com.sun.javafx.scene.control.skin.LabelSkin.handleControlPropertyChanged(LabelSkin.java:49) at com.sun.javafx.scene.control.skin.BehaviorSkinBase.lambda2.onProposedChange(Parent.java:367)atcom.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:113)atcom.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108)atcom.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:575)atcom.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(LabeledSkinBase.java:204)atcom.sun.javafx.scene.control.skin.LabelSkin.handleControlPropertyChanged(LabelSkin.java:49)atcom.sun.javafx.scene.control.skin.BehaviorSkinBase.lambdaregisterChangeListener$61(BehaviorSkinBase.java:197)
at com.sun.javafx.scene.control.MultiplePropertyChangeListenerHandler1.changed(MultiplePropertyChangeListenerHandler.java:55)atjavafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89)atcom.sun.javafx.binding.ExpressionHelper1.changed(MultiplePropertyChangeListenerHandler.java:55) at javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89) at com.sun.javafx.binding.ExpressionHelper1.changed(MultiplePropertyChangeListenerHandler.java:55)atjavafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89)atcom.sun.javafx.binding.ExpressionHelperSingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.property.StringPropertyBase.fireValueChangedEvent(StringPropertyBase.java:103)
at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:110)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:144)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49)
at javafx.beans.property.StringProperty.setValue(StringProperty.java:65)
at javafx.scene.control.Labeled.setText(Labeled.java:145)
at controller.RootLayoutController.updateLabel(RootLayoutController.java:255)
at controller.RootLayoutController.getReady(RootLayoutController.java:238)
at controller.RootLayoutController.lambda$login2(RootLayoutController.java:221)atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)atjava.util.concurrent.ThreadPoolExecutor2(RootLayoutController.java:221) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor2(RootLayoutController.java:221)atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)atjava.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)


  • 解决方案

之所以抛出异常,是因为javaFX程序不允许用户在FX application thread线程外更新界面的组件信息,换句话说,所有的更新界面组件的信息的代码,都应该在在FX application thread线程中执行。解决办法还是有的,用Platform类的runLater方法可以解决该问题。

runLater方法的定义如下
public static void runLater(Runnable runnable) {
  PlatformImpl.runLater(runnable);
}

通过阅读javaAPI文档,可以知晓,该方法可以将参数runnable将要执行的代码,交给FX application thread线程执行,这样问题就解决了。具体解决模板如下。

  • 假设在一个自己创建的线程中,调用了update()方法,update()方法用于更新主界面的组件信息,这会导致如题的异常
  • 此时,可以如下调用update()方法
    Platform.runLater(()->{
      update();
       //任何更新界面组件信息的代码
    });
JavaFX 应用层并发编程:Worker<V>接口 <think>我们被要求根据给出的内容生成一个≤150字的文章摘要。内容是关于JavaFX中Worker接口的详细解释,对比与之前类的差异,源码分析,以及深层架构哲学。摘要需要简洁,涵盖核心要点。注意字数限制。我们要提取出最关键的信息。 主要点: Worker是JavaFX异步后台任务的标准化接口。 解决耗时数据在后台生产及安全通知UI的问题。 生命周期状态:READY, SCHEDULED, RUNNING, SUCCEEDED, CANCELLED, FAILED。 暴露只读属性(state, valu 阅读详情

相关推荐

数据仓库实践:从ITR流程讲指标体系建设

从 ITR 流程或者其他客服反馈流程的考核过程可见,实际工作中不可能只通过单个指标评价一个业务过程,需要从多个维度梳理业务,并把多个高度相关的指标组织起来,以避免只考虑其中某个指标从而摧毁整个业务过程的结果,指标体系=指标+体系。

the_singing_towers的博客 2265

java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4

JavaFX: 在一个新的线程中调用更新组件的方法,如更新Label的值,new Thread(()->label.setText(str)).start(); 若String str不断变化 就会报错Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; c...

season_hai 3870

Django Cookie/Session

Cookie是一种小型的文本文件,通常由Web服务器发送到用户浏览器,并存储在用户的本地计算机上。当用户再次访问该网站时,浏览器会将Cookie发送回服务器,从而实现用户身份验证、个性化设置等功能。Session是一种在服务器端存储用户会话信息的方式。与Cookie不同,Session数据存储在服务器上,而不是客户端。Django框架通过在客户端存储一个Session ID来实现Session的跟踪。Django框架的Cookie/Session机制为开发者提供了方便的数据存储和会话管理功能。

froginwe11的博客 467

Not on FX application thread问题解决方法

Not on FX application thread; currentThread = Thread-4

不再彷惶 6119

深度探索:非线性随机森林(Nonlinear Random Forest,NL-RF)原理及应用

非线性随机森林(NL-RF)旨在通过结合集成方法与高级技术来捕捉和建模数据中的非线性关系,从而改善传统随机森林在处理复杂非线性数据结构时的表现。

qq_51320133的博客 2067

FLUKA软件在Ubuntu的安装指南(亲测有效)

FLUKA其强大的蒙特卡洛模拟能力使得用户能够模拟复杂的辐射相互作用过程

chencheng1127的博客 2887

JavaFx异常: Not on FX application thread; currentThread = Timer-0

Exception in thread "Timer-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = Timer-0

isS_MK_GmbH的博客 1198

深度强化学习-D3QN算法原理与代码

Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能。如果对Doubel DQN和Dueling DQN算法还不太了解的话,可以参考我的这两篇博文:深度强化学习-Doubel DQN算法原理与代码和深度强化学习-Dueling DQN算法原理与代码,分别详细讲述了这两个算法的原理以及代码实现。本文就带领大家了解一下D3QN算法,代码链接见下方。 代码:https://github.com/indigo

weixin_46133643的博客 2万+

javafx报错not on fx application thread

javafx聊天室,如果有新用户上线刷新listView,就是重新设置listView的items的时候遇到的一个Exception。 Exception抛出的原因是:javafx所有的UI都是线程不安全的,所以在子线程中要修改Application中的UI组件会抛出exception。 javafx给出的解决方案是所有UI控件的改变写在Platform.RunLater()里面。一下是我原先的

nimahai_balabala的博客 2814

HFSS实战:手把手教你设计3.3-10.6GHz超宽带微带天线(附S11优化技巧)

本文提供了一份基于Ansys HFSS的超宽带微带天线实战设计指南,详细讲解了从3.3GHz到10.6GHz天线的建模、仿真与优化全流程。文章重点剖析了阻抗匹配的核心挑战,并分享了通过接地板开槽、参数化扫描及目标驱动优化等系统性技巧来优化S11曲线的实用方法,帮助射频工程师快速掌握超宽带天线设计的关键技能。

2y3u4i5o6p的博客 1081

【Claude】Extra inputs are not permitted 错误:代理剥离 Beta 标头的解决方案 bug报错已解决

深入分析Claude Code Extra inputs are not permitted 400错误的技术原理,解析代理剥离Beta标头的根因与多种修复方案。

一键难忘的博客 147

【javaFX基础】 “Not on FX application thread; currentThread = Thread-3“问题解决方法

更新控件涉及到的线程问题

212

199、医疗内窥镜影像:微型镜头与高色彩保真度的ISP定制化方案

医疗内窥镜影像系统开发面临三大光学挑战:衍射极限导致分辨率下降,微型镜头色差严重,镀膜不足引发红外漏光。团队通过定制化ISP方案解决问题:采用分区色差补偿、红外泄露补偿技术,开发12区域分段颜色校正矩阵,并设计自适应伽马曲线。关键经验包括锁定白平衡避免术中偏色,优化FPGA流水线确保30fps流畅度,强调光学标定优先于算法优化。最终方案使DeltaE降至3以下,满足医生对组织颜色细微差异的识别需求,尤其解决了血管与脂肪边界辨识难题。

zzfmlxs的博客 265

java fx 线程_java.lang.IllegalStateException:不在FX应用程序线程上;currentThread =线程4...

我正在尝试从线程中设置文本对象的字符串,但这给了我这个错误:Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unkno...

weixin_33785291的博客 419

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java fx 线程_java - 为什么在JavaFX上出现java.lang.IllegalStateException“不在FX应用程序线程上”? - 堆栈内存溢出...

我有一个具有TableView附加了侦听器的应用程序,因此一旦检测到更改,它便会刷新,但事实是我正在获取java.lang.IllegalStateException: Not on FX application thread; currentThread = Smack Listener Processor (0)参见Eclipse java.lang.IllegalStateException...

weixin_32137855的博客 344

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JAVA FX 对UI组件的控制问题

问题描述:按钮启动新线程对UI的控制时出现以下问题java.lang.IllegalStateException: Not on FX application thread针对这个问题解决方法如下:Platform.runLater(new Runnable() { @Override public void run() { //if you change the U

蜗牛x博客 2456

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

javafx 新线程运行 Alert 报错 Exception in thread “Thread-3“ java.lang.IllegalStateException: Not on FX app

【代码】javafx 新线程运行 Alert 报错 Exception in thread "Thread-3" java.lang.IllegalStateException: Not on FX app。

qq_43615820的博客 687

java import thread_java - 关于“线程5”中的异常的问题java.lang.IllegalStateException:在FX应用程序线程上不存在; currentThre...

我试图使用Java线程将秒表嵌入到我的应用程序中,但是我不得不面对一个异常,因此,由于这个原因,我现在将其放在那儿。 我是线程新手。 此外,我使用JavaFX构建UI。 我想弄清楚这里发生的事情像该异常一样跳跃。当我调用名为“ actionTakeOrder”的动作时,我请求一些数据,并且它可以正常工作,没关系。 之后,我通过它调用“ callStopWatch()”,然后尝试启动一个用j...

weixin_39717692的博客 663

javafx在子线程中改变数据并将其设置显示在图形化控件上报错的解决方法

报错信息: Exception in thread "Thread-" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread- 显示信息不在 FX application线程中, 原错误代码为:... @FXML private Button showFile; ... @F

machong_mc的博客 780

暑假)学习总结

解决异常 Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4 异常原因: 运行javaFX程序,系统会自动创建一个FX application thread线程,用于更新界面的组件信息,例如ListView的items、Label的text。当我们想运用多线程实现业务,而自己创建的线程又直接导致了界面组件信息的更新

m0_58390146的博客 255

Not on FX application thread; currentThread = * 问题的解决

1.前言在JavaFX的开发中,在其他线程更新JavaFX的线程上的信息的时候,就可能报这种错误 Not on FX application thread; currentThread = * 2具体解决的方案找到子线程中更新主线程的代码 将其放在以下代码块中即可解决 Platform.runLater(new Runnable() { @Override public voi

huplion的专栏 1万+

深入解析java.lang.IllegalStateException异常

是Java中的一个非受检异常,它表示在不适当的时间或状态下调用方法。日志记录工具:如Log4j、Logback等,可以记录异常信息和错误日志,方便排查和分析问题。断言工具:如Assert类,可以在程序中添加断言语句,用于验证代码中的假设条件是否满足,帮助我们在开发和测试阶段快速发现问题。异常处理框架:如Spring框架中的异常处理机制,可以统一处理应用程序中的异常,提供统一的异常处理逻辑和错误信息返回。异常是程序中常见的错误和异常情况,合理处理异常对于保证程序的正确性和稳定性非常重要。

博客 4万+

报错Exception in thread “pool-1-thread-2“ Exception in thread “pool-1-thread-1“ java.lang.IllegalMonit

java.lang.IllegalMonitorStateException是一个运行时异常,当一个线程在不拥有监视器的情况下尝试等待、通知或唤醒时,就会发生这个异常。这个异常通常在线程在非同步的代码块或方法中调用这些方法时发生。为了调用这些方法,线程必须先通过使用synchronized关键字获取对象的监视器。要修复这个错误,请确保在同步的代码块或方法内部调用wait、notify或notifyAll方法。确保调用这些方法的线程拥有对象的监视器。

qq_42266317的博客 1531
上一篇: Windows 2012 R2 服务器 搭FTP 无法在 windows资源管理器 打开
下一篇: crontab 莫名报错
水丸
博客等级 码龄10年 4粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值