Java JFrame在while循环期间冻结

Java JFrame在while循环期间冻结,java,swing,while-loop,jframe,jprogressbar,Java,Swing,While Loop,Jframe,Jprogressbar,我正在开发一个Java程序,它读取文本文件并进行一些概率计算。读取文件和所有相关计算都在while循环中完成 我使用JFrame创建了一个GUI,在这里我添加了一个进度条(使用JProgressBar)来显示进度,因为程序处理文件需要一段时间 代码看起来像- while( there are more files to read ) { Read this file ; Do calculations ; Update progress bar ; } 现在,问题是一

我正在开发一个Java程序,它读取文本文件并进行一些概率计算。读取文件和所有相关计算都在while循环中完成

我使用JFrame创建了一个GUI,在这里我添加了一个进度条(使用JProgressBar)来显示进度,因为程序处理文件需要一段时间

代码看起来像-

while( there are more files to read )
{
    Read this file ;
    Do calculations ;

    Update progress bar ;
}
现在,问题是一旦while循环开始并处理第一个文件,JFrame就会冻结。进度条没有更新,我无法按下JFrame中的任何按钮。while循环结束后,将更新帧,并将进度条更新为其最终值(因此,进度条从0开始,然后暂停,最后转到100)

有人能解释一下为什么JFrame会冻结吗?是否可以在while循环迭代中更新它(JFrame中的进度条)


谢谢

您正在事件调度线程(EDT)中执行时间密集型任务。这是个坏主意,因为EDT也会更新UI。因此,如果此线程被阻止,则不会对UI进行更新。

一个线程一次只能做一件事。因此,如果让它进行计算,它将不会更新gui。所以你应该使用另一个线程。您可能还需要重新绘制gui。

解决方案是使用
线程,这就是原因,因为您正在冻结,您正在同时执行所有操作

请看:


请阅读。另请参阅此相关内容。如果您使用其他线程读取文件,则无需手动重新绘制,因为这通常由EDT.Ah cool完成。我不确定。我过去在重新绘制方面遇到过问题,所以我想我应该只提一下。没错,但也不是全部:所有与swing view相关的访问都必须发生在一个特定的线程上,即不祥的EDT:-)