当前位置: 首页 > news >正文

定时器更新界面,线程报错

项目场景:

在javafx框架下使用线程更新UI的时候,出现无法正常更新UI。

问题代码如下:

package clock;import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;public class SimpleClock extends Application{public static void main(String[] args) {Application.launch();}public void start(Stage stage) {Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {init(stage);});}}, 0, 1000); }private void init(Stage stage){Calendar calendar = new GregorianCalendar();int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);ClockPane cPane = new ClockPane(hour, minute, second);Scene scene = new Scene(cPane, 300, 300);stage.setTitle("Watch");stage.setScene(scene);stage.show();}}

问题描述

运行程序之后,出现如下报错:

Exception in thread "Timer-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = Timer-0at javafx.graphics@22.0.1/com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:294)at javafx.graphics@22.0.1/com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:481)at javafx.graphics@22.0.1/javafx.stage.Stage.setScene(Stage.java:269)at clock.SimpleClock.init(SimpleClock.java:34)at clock.SimpleClock$1.run(SimpleClock.java:23)at java.base/java.util.TimerThread.mainLoop(Timer.java:571)at java.base/java.util.TimerThread.run(Timer.java:521)

原因分析:

checkFxUserThread

从出错日志看出checkFxUserThread这个方法在检查用户进程是否为UI线程,如果不是会抛出异常,这是因为为了使UI渲染不出现阻塞现象,不允许在子线程中进行UI操作。


解决方案:

可以使用javafx框架提供的runlater方法,实现切换到UI线程来执行更新UI的操作。

    public void start(Stage stage) {Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {Platform.runLater(new Runnable() {@Overridepublic void run() {init(stage);}});}}, 0, 1000); }

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Hack The Box(黑客盒子)Redeemer篇
  • C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编
  • STM32F103C8移植uCOSIII并以不同周期点亮两个LED灯(HAL库方式)【uCOS】【STM32开发板】【STM32CubeMX】
  • 软件测试--第六章、系统功能测试
  • 自动化专业之半导体行业入门指南
  • Spring Boot通过自定义注解和Redis+Lua脚本实现接口限流
  • 牛客网刷题 | BC120 争夺前五名
  • TiDB-从0到1-配置篇
  • Linux下软件安装
  • 【ROS2大白话】四、ROS2非常简单的传参方式
  • 55.ReentrantReadWriteLock应用于缓存
  • Laravel学习-自定义辅助函数
  • LINUX网络FTP服务
  • Linux中网络配置项目笔记
  • 【Stable Diffusion】(基础篇二)—— Stable Diffusion图形界面介绍和基本使用流程
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Angular Elements 及其运作原理
  • CSS盒模型深入
  • echarts的各种常用效果展示
  • Effective Java 笔记(一)
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript对象详解
  • learning koa2.x
  • Linux后台研发超实用命令总结
  • maven工程打包jar以及java jar命令的classpath使用
  • Redis 中的布隆过滤器
  • storm drpc实例
  • Twitter赢在开放,三年创造奇迹
  • zookeeper系列(七)实战分布式命名服务
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 初识 webpack
  • 初探 Vue 生命周期和钩子函数
  • 番外篇1:在Windows环境下安装JDK
  • 关于 Cirru Editor 存储格式
  • 写代码的正确姿势
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • # 数据结构
  • #{} 和 ${}区别
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #在 README.md 中生成项目目录结构
  • $.ajax()
  • (21)起落架/可伸缩相机支架
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (力扣)1314.矩阵区域和
  • (六)Hibernate的二级缓存
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .“空心村”成因分析及解决对策122344
  • .net 4.0发布后不能正常显示图片问题