2011-11-24 44 views
3
public void myMethod { 
    MyProgessBarFrame progFrame = new MyProgressBarFrame(); // this is a JFrame 
    progFrame.setVisible(true); // show my JFrame loading 

    // do some processing here while the progress bar is running 
    // ..... 

    progFrame.setvisible(false); // hide my progress bar JFrame 
} // end method myMethod 

我有上面的代碼。但是當我運行它時,做一些處理部分不會處理,直到我關閉進度條JFrame。使用JProgressBar運行JFrame

我將如何顯示我的進度條並告訴Java在執行處理部分繼續?

+5

您是否閱讀過'JProgressBar API'?它有一個關於「如何監控進度」的Swing教程的鏈接,該教程還討論了'Concurrency'和'SwingWorkers'。 – camickr

+0

是的,camickr是正確的錢。 –

+0

謝謝你們!目前,我沒有閱讀時間。我正在做一個項目:-( – epsac

回答

9

你有一個經典的併發問題和Swing問題。你的問題在於你在主Swing線程,EDT或Event Dispatch Thread上執行了一個長時間運行的任務,這將鎖定線程,直到進程完成,阻止它完成任務,包括與用戶交互以及繪製GUI圖形。

解決方案是在後臺線程中執行長時間運行的任務,例如由SwingWorker對象提供的任務。然後,您可以通過SwingWorker的發佈/進程對更新進度條(如果行列式)。欲瞭解更多信息,請閱讀Concurrency in Swing上的這篇文章。

例如,

public void myMethod() { 
    final MyProgessBarFrame progFrame = new MyProgessBarFrame(); 
    new SwingWorker<Void, Void>() { 
    protected Void doInBackground() throws Exception { 

     // do some processing here while the progress bar is running 
     // ..... 
     return null; 
    }; 

    // this is called when the SwingWorker's doInBackground finishes 
    protected void done() { 
     progFrame.setVisible(false); // hide my progress bar JFrame 
    }; 
    }.execute(); 
    progFrame.setVisible(true); 
} 

而且,如果這是從另一個Swing組件顯示,那麼你或許應該表現出一個模式的JDialog不是一個JFrame。這就是爲什麼我在SwingWorker代碼之後的窗口上調用了setVisible(true) - 所以如果它是模態對話框,它不會阻止SwingWorker被執行。

+0

哇!好像我需要在成功之前瞭解很多概念在Java中進行GUI編程我嘗試了你的代碼,它確實有效,儘管我還不能理解它背後的理論,我會在我交付項目時閱讀你提供的鏈接,非常感謝! – epsac

+0

@ Jec:這不是僅僅用於GUI編程,而是用於一般編程,這就像找到一個永無止境的Matryoshka娃娃一樣。 –

2

您會注意到,當顯示進度條時,以及進度條的處理,實際任務也正在完成。所以你可以從這裏瞭解到有多線程正在進行。

在Java中,您可以創建一個單獨的線程來顯示進度條,並在主線程中執行您的任務。所以這兩個進程將同時運行,並且它將滿足您的需求。

*注意:進度條中顯示的進度應取決於正在主線程中完成的處理。

你可以檢查這些鏈接Threads & Progress Bar在Java中。