前情讨论:
最近在做一个Java GUI小程序,点击按钮(JButton)进行一些处理,然后在文本框(JTextArea)中输出相关信息。
看过别人的讨论说,如果处理部分比较复杂且耗时,就会阻塞swing线程,导致swing线程中JTextArea组件对象的内容不能实时刷新:当处理部分的代码运行结束时,JTextArea的内容会一下子刷新。
也就是提示信息不是一条一条显示的,而是在界面卡一段时间之后,一下全部显示。建议另外开启线程来进行复杂的处理。
参考博客:
Java Swing 实时刷新JTextArea,以显示不断append的内容? 这里提到了三种方法,可以按实际情况选择
其中第三种方法的原博是:https://www.cnblogs.com/Forrest-Janny/p/6610759.html (原博更详细一点,建议看原博)
方法一
1.使用JTextArea的paintImmediately方法
JTextArea继承了javax.swing.JComponent 的 paintImmediately 方法
//将info立即追加到JTextArea中public static void appendJTextArea(String info) { promptContent.append(info+"\n"); promptContent.paintImmediately(promptContent.getBounds()); }
//将info立即追加到JTextArea中public static void appendJTextArea(String info) { promptContent.append(info+"\n"); promptContent.paintImmediately(promptContent.getX(), promptContent.getY(), promptContent.getWidth(), promptContent.getHeight()); }
需要追加信息时,调用编写的appendJTextArea方法即可。效果:可以实时追加。
我的问题:
因为我要追加的内容很多,所以将JTextArea放在了JScrollPane中,超出的部分可通过拖动垂直或水平的滑块观察到。
但仍然出现了问题:JTextArea矩形框大小内的信息是实时更新的,超出部分是在窗口卡住一段时间后,同时添加的。
修正:
还是需要将处理部分另起一个线程来完成,所有的内容都是实时显示的。可以自己编写开启新线程,也可以参考方法三中第1、3段代码。
方法二
使用Swing线程的SwingUtilities.invokeLater 来追加内容
public static void appendJTextArea(String info) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // TODO Auto-generated method stub if(info != null) { promptContent.append(info+"\n"); } } });}
问题:
情况同方法一相同:需要将处理部分在新开启的线程中完成,可以自己编写,也可以参考方法三第1、3段代码
方法三
https://www.cnblogs.com/Forrest-Janny/p/6610759.html的思路是:JTextArea追加信息时开启一个线程,进行复杂处理时也开启一个线程,这样两个线程之间是不干涉的。
static private ExecutorService service = Executors.newCachedThreadPool(new ThreadFactory() { @Override public Thread newThread(Runnable r) { return new Thread(r, "output"); }});
接下来就是,在追加信息方法中开启线程,在复杂处理处开启线程
public static void appendJTextArea(String info) { service.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub promptContent.append(info+"\n"); } });}
//为startButton设置监听器startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { service.submit(new Runnable() { @Override public void run() { //这里写自己进行的处理 } }); }//actionPerformed });
效果总结:三种方法都可以实时追加信息
补充(我的情况)
处理过程:通过循环实现读取、解析多个文件,每个循环中需要输出多个提示信息,信息之间有一定逻辑联系,例如:打开了xx文件->成功提取了数据->成功存入数据库...
使用方法三时出现了一点问题,它将两个临近的循环中的提示信息交替输出了,我的期望是相同文件的提示一起输出。
交叉输出例子:(同一文件的信息输出应该连着的,这里用相同颜色代表同一文件)
打开了aaa文件
提取了数据
打开了bbb文件
成功存入数据库
提取了数据
成功存入数据库
期望追加信息的效果是:
打开了aaa文件
成功提取了数据
成功存入数据库
打开了bbb文件
成功提取了数据
成功存入数据库
方法一,方法二是按我的预期输出的。
原网址: 访问
创建于: 2024-02-18 16:03:20
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论