Java没有在循环内更新textarea

时间:2014-09-15 18:50:48

标签: java multithreading swing textarea updating

HY。

在我(java newbe)未能解决的问题上寻找这个答案后,我决定要求。我的程序包含一个Form JFrame,其中包含一个启动例程的buttom。

  1. JChooser获取文件夹
  2. 获取该文件夹中所有文件的列表
  3. 启动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)
    
            }
        }
    }
    

    就是这样。请问有人帮帮我吗?

1 个答案:

答案 0 :(得分:1)

如果在} ,如果在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。