Java没有在循环内更新textarea
Posted
技术标签:
【中文标题】Java没有在循环内更新textarea【英文标题】:Java dont updating textarea inside a loop 【发布时间】:2014-11-09 09:09:44 【问题描述】:Hy.
在以我 (java newbe) 无法理解的方式寻找这个答案之后,我决定去问。我的程序包含在一个 JFrame 表单中,它带有一个启动例程的按钮。
-
JChooser 获取文件夹
获取该文件夹中所有文件的列表
开始一个for(循环) 3. 解压缩每个文件 (.tgz) 的过程。展开的 tgz 显示一个 .tar 4. 展开焦油的进程。 5. 从 .tar 获取 .csv 文件并进行一些更改的另一个过程。 结束for
所有这些都在 (private void btPegaDirActionPerformed(java.awt.event.ActionEvent evt)) 中。但我有一个 textarea(名称是 txtDisplay),它只在孔处理后更新。好的,我知道 Swing 必须有一个外部进程在进程结束时实时更新(即 unpiz #1、unzip #2、更改 CSV),我不知道如何创建外部进程。
这里是代码。
private void btPegaDirActionPerformed(java.awt.event.ActionEvent evt)
JCHooser....
Get file to array (between 28 to 32 files)
for (File arqTGZ : files)
try
unzip tgz (unfolds a tar)
System.out.println("Unzip OK")
(must updata java textarea here)
unzip tar (unfolds a csv)
System.out.println("Unzip OK")
(must updata java textarea here)
change CSV
System.out.println("CSV Saved")
(must updata java textarea here)
就是这样。有人可以帮帮我吗?
【问题讨论】:
我认为你需要将你的程序(和你的问题)分解成更小的块。尝试只写“更新 CSV”的部分,而不用担心文本区域或 tar 文件。然后在遇到困难时提出问题。 ***.com/questions/629315/… 【参考方案1】:循环正常如果它没有在UI/Event Dispatch Thread上完成 - 如果一个长任务直接在 UI/EDT 线程上完成,那么所有渲染/交互将停止,直到操作完成使应用程序“冻结”。
使用 SwingWorker as covered in this trail 创建执行任务的后台线程/worker。然后使用bound properties 并连接 UI 以从后台工作人员那里收听适当的状态。这种方法(在自定义属性上使用 firePropertyChange 除外)在 SwingWorker class documentation 中作为 PrimeNumbersTask 进行了介绍。
在紧要关头,可以手动使用SwingUtilities.invokeLater 将“必须更新”封装在后台线程中,以便在 EDT 上完成 UI 操作。但是,由于这增加了工作人员实现和 UI 之间的耦合,因此应该首选绑定属性。
确保在活动之间使用support cancelation,并防止[意外] 执行多个并发的 SwingWorkers 处理同一任务。
【讨论】:
谢谢!我找到了办法。现在我明白了,进程必须放在主进程之外。它工作得很好。非常感谢!以上是关于Java没有在循环内更新textarea的主要内容,如果未能解决你的问题,请参考以下文章