2010-07-29 91 views
0

我正在NetBeans中創建一個應用程序,並且希望有一個狀態標籤來說明在任何特定時刻程序中發生了什麼。有很多代碼,但是它的功能大致如下:只需假裝statusLabel是已經放入程序的標籤,並且每個函數都是一個耗時幾秒鐘的昂貴函數。如何更新標籤以使其顯示新文本?

statusLabel.setText("Completing Task 1"); 
System.out.println("Completing Task 1"); 
this.getFrame().repaint(); //I call this function and the two functions below it but the label still does not change. 
statusLabel.updateUI(); //Doesn't seem to do much. 
statusLabel.revalidate(); //Doesn't seem to do much. 
this.completeTask1(); 
statusLabel.setText("Completing Task 2"); 
System.out.println("Completing Task 2"); 
statusLabel.revalidate(); 
this.getFrame().repaint(); 
... 

這一直持續到UI完成4項任務。在整個過程中,標籤不會更新,直到每個任務完成後,然後它會顯示「完成任務4」。 System.out.println調用雖然完美。基本上我想知道我應該怎麼做才能讓標籤顯示它已經設置的新文本。

+0

這需要多線程。您的標籤沒有更新,因爲您的唯一線程正在用於運行在「後臺」中運行的其他代碼,直到完成,您的GUI不會更新。多線程在需要時未被使用時的一個常見問題。這是關於[Concurrency]的Java Oracle教程(http://docs.oracle.com/javase/tutorial/essential/concurrency/),它包含了解決您的問題需要了解的多線程的一切,並且是完美的開始學習關於編程的更困難和必要的概念之一。 http://docs.oracle.com/j – CODe 2012-11-10 04:41:03

回答

1

代碼的答案是正確的,但我會用SwingWorker類去:

的抽象類在專用線程中執行長時間GUI交互任務。

這是您的問題的正確工具。