Java 不在循环内更新文本区域

标签 java multithreading swing textarea updating

嘿。

在以我(java newbe)无法理解的方式寻找这个答案之后,我决定询问。我的程序由一个 Form JFrame 组成,其中带有一个启动例程的按钮。

  1. JChooser 获取文件夹
  2. 获取该文件夹中所有文件的列表

开始一个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/

相关文章:

java - JTextField 无法正确插入字符

java - 用java中的空格替换json字符串中的特殊字符(不可打印的字符)

c++ - boost::thread:如何启动所有线程,但一次最多只能运行 n 个线程?

java - 在带有 var=Thread.currentThread() 的代码块上同步(...)

java - 仅尝试互联网连接几秒钟

Java.drawImage : How do I "unDraw" or delete a image?

java - jTable添加多行

java - 使用 gwt-rpc 时检测服务器上取消的请求

java - 当登录表单为 javascript 时,使用 HtmlUnit 登录网站

java - 如何在 Java 中使用带有托盘图标的上下文菜单?