2013-04-03 225 views
2

我正在研究Java程序,它读取文本文件时会进行一些概率计算。读取文件和所有相关的计算在一个while循环中完成。JFrame在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中的进度条)?

谢谢!

+3

请仔细阅读[并发在Swing(http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ )。 – mre

+1

请参阅此相关的[示例](http://stackoverflow.com/a/4637725/230513)。 – trashgod

回答

3

您正在事件派发线程(EDT)中完成您的时间紧张任务。由于EDT还更新了用户界面,因此这是一个糟糕的主意。因此,如果此线程被阻止,则不会更新UI。

1

线程一次只能做一件事。所以如果你让它做计算它不会更新gui。所以你应该使用另一个线程。你也可能需要重新绘制你的GUI。

+0

如果使用另一个线程读取文件,则不需要手动重新绘制,因为这通常由EDT完成。 –

+0

很酷。不确定。我过去曾经有过重新涂漆的问题,所以我想我只是提到它。 – WereWolfBoy

2

解决方法是使用threads,这就是因为你被冻结的原因,你正在同时做所有事情。

请看看:

+0

不是不正确的,但也不是全部:所有与摆动视图相关的访问必须发生在特定的线程,不祥的EDT :-) – kleopatra