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的主要内容,如果未能解决你的问题,请参考以下文章

数组在循环内更新,但循环外部为空

在后台线程内循环并不断更新 UI 时使用啥?

尝试在 for 循环中更新嵌套的 ArrayList

如何重新启动应用程序的更新循环

循环通过 IP 地址时 UI 未更新

在 Java JDBC 中将行插入没有更新方法的 ResultSet