HY。
在我(java newbe)未能解决的问题上寻找这个答案后,我决定要求。我的程序包含一个Form JFrame,其中包含一个启动例程的buttom。
启动for(循环) 3.解压缩每个文件(.tgz)的过程。展开的tgz揭示了一个.tar 4.展开焦油的Processo。 5.另一个从.tar获取.csv文件并进行一些更改的进程。 结束了
所有这些都在(private void btPegaDirActionPerformed(java.awt.event.ActionEvent evt))中。但我有一个textarea(名称是txtDisplay),它只在孔过程后更新。好的,我知道Swing必须有一个outter进程,以便在进程结束时实时更新(即unpiz#1,解压缩#2,更改CSV),而且我不知道如何创建outter进程。
这是代码。
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)
}
}
}
就是这样。请问有人帮帮我吗?
答案 0 :(得分:1)
如果在3>} ,如果在UI / EDT线程上直接完成一项长任务然后所有渲染/交互将停止,直到操作完成使应用程序“冻结”。
使用SwingWorker UI/Event Dispatch Thread创建实现任务的后台线程/工作人员。然后使用as covered in this trail并连接UI以从后台工作人员收听适当的状态。这种方法(在自定义属性上使用bound properties除外)在firePropertyChange中作为PrimeNumbersTask进行了介绍。
可以手动使用夹点SwingWorker class documentation来包装后台线程中的“必须更新”,以便在EDT上完成UI操作。但是,由于这会增加worker实现和UI之间的耦合,因此应该首选绑定属性。
确保活动之间SwingUtilities.invokeLater并防止[意外]执行处理相同任务的多个并发SwingWorkers。