2013-04-03 222 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