嘿。
在以我(java newbe)无法理解的方式寻找这个答案之后,我决定询问。我的程序由一个 Form JFrame 组成,其中带有一个启动例程的按钮。
- JChooser 获取文件夹
- 获取该文件夹中所有文件的列表
开始一个for(循环) 3. 解压缩每个文件 (.tgz) 的过程。展开的 tgz 会显示一个 .tar 4. 展开 tar 的 Processo。 5. 从 .tar 获取 .csv 文件并进行一些更改的另一个过程。 结束 for
所有这些都在 (private void btPegaDirActionPerformed(java.awt.event.ActionEvent evt)) 内。但我有一个文本区域(名称为 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)
}
}
}
就是这样。有人可以帮我吗?
最佳答案
如果没有在 UI/Event Dispatch Thread 上完成循环,则循环正常。 - 如果直接在 UI/EDT 线程上完成长任务,则所有渲染/交互都将停止,直到操作完成,使应用程序“卡住”。
使用 SwingWorker as covered in this trail创建一个后台线程/工作线程来实现任务。然后使用bound properties并连接 UI 以监听来自后台工作人员的适当状态。 firePropertyChange 中介绍了此方法(在自定义属性上使用 SwingWorker class documentation 除外)。 ,作为 PrimeNumbersTask。
紧要关头SwingUtilities.invokeLater可以手动用于将“必须更新”包装在后台线程内,以便 UI 操作在 EDT 上完成。但是,由于这会增加工作器实现和 UI 之间的耦合,因此应该首选绑定(bind)属性。
确保support cancelation并防止多个并发 SwingWorkers 处理同一任务的[意外]执行。
关于Java 不在循环内更新文本区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25854858/