2012-05-04 64 views
6

我只是想在我的框架的左下角有一個不確定的JProgressBar動畫,當長時間下載完成時。基本不確定JProgress Bar Usage

我已經瀏覽了很多教程,其中沒有一個對我很清楚。我只是想讓它在後臺下載文件時有動畫效果。我嘗試過的每種方式都不會爲進度條設置動畫效果,直到完成之後的

我需要幫助,知道在哪裏放置我的下載()調用。

class MyFunClass extends JFrame { 
    JProgressBar progressBar = new JProgressBar(); 

    public void buttonClicked() { 
    progressBar.setVisible(true); 
    progressBar.setIndeterminate(true); 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     progressBar.setIndeterminate(true); 
     progressBar.setVisible(true); 

     // Do I do my download() in here?? 

    }}); 

    // Do download() here??? 
    progressBar.setVisible(false); 
    } 
} 

在此先感謝!



解決方案

編輯:對於那些誰在未來也有類似的問題,對我來說,這是一個基本的問題基本解決。這不是我的代碼,而是一個普通的草圖。內部buttonClicked()

public void buttonClicked() { 
    class MyWorker extends SwingWorker(String, Object) { 
    protected String doInBackground() { 
     progressBar.setVisible(true); 
     progressBar.setIndeterminate(true); 

     // Do my downloading code 
     return "Done." 
    } 

    protected void done() { 
     progressBar.setVisible(false) 
    } 
    } 

    new MyWorker().execute(); 

} 
+0

你應該看看http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html即使它看起來很複雜。你需要做的是在另一個線程(backgroundworker)中運行下載。然後主(gui)線程執行progressBar動畫。你這樣做的方式實際上是另一種方式。 – user845279

+1

請參閱**編輯2 **到我的答案來糾正一些問題。 –

回答

9

您當前的代碼顯示沒有創建一個後臺線程,而是它表明你試圖Swing線程隊列代碼 Swing線程這沒有意義的內這個問題(雖然偶爾有時候你可能想這樣做,但是再次,不在這裏)。成功的唯一方法是使用後臺線程。標準的Oracle JProgressBar tutorialConcurrency in Swing經歷了所有這些。

基本的是,您必須從Swing線程更新JProgressBar,以便在後臺線程中執行您的長時間運行的進程,例如由SwingWorker對象提供的進程。我們有太多的細節可以在這裏查看,所以我只能提供一個鏈接,但我們很樂意在您查看教程後幫助您瞭解詳細信息。如果你仍然陷入困境,只需查看教程並回答你的具體問題。

編輯1
幽州:

我能不能創造buttonClicked()函數中的一個新的線程對象?

是的,你可以創建buttonClicked()方法的內部的SwingWorker對象並執行它。

事情是我有我的開發GUI的所有功能,我的API和庫,它似乎是一個纏繞在一個線程函數調用longwinded解決方法。

對不起,但我不知道你在說什麼,或者你認爲線程會導致什麼問題。 buttonClicked()方法可能必須在EDT上運行,而不是在後臺線程中運行。

另請注意,在我的大多數更復雜的Swing GUI中,我經常在不同的(模型)對象中下載文件,並從GUI對象(視圖)中創建另一個不同的對象(控件)中的SwingWorker。這樣做似乎更加複雜,但是這樣做很複雜,但是當我這樣做時,更容易調試,維護和增強我的程序,尤其是當我大量使用接口來允許我測試所有程序組件時隔離。

編輯2
一些修改,以您的解決方案後。您發佈的評論:

public void buttonClicked() { 
    class MyWorker extends SwingWorker(String, Object) { 
    protected String runInBackground() { 
     progressBar.setVisible(true); 
     progressBar.setIndeterminate(true); 

     // ... 

其中有問題

  • doInBackground(),不runInBackground()
  • ,但更重要的是,你讓從後臺線程中的Swing調用,這東西不應該做(除非這個調用是線程安全的,甚至是......)。

因此改變:

public void buttonClicked() { 
    progressBar.setVisible(true); 
    progressBar.setIndeterminate(true); 
    class MyWorker extends SwingWorker<String, Void> { 
    protected String doInBackground() { 

     // ... 
+0

我可以在buttonClicked()函數內創建一個新的線程對象嗎?事情是我有我的開發GUI的所有功能的API和庫,並且它看起來像是一個繞行的函數調用的繞行方法。 –

+0

@ B.VB .:請參閱上面我的回答的編輯1。 –

+0

謝謝你的時間到目前爲止。我正在採取這種方法,一旦我得到這個工作,我會標記答案。這是一個令人沮喪的是,構建一個簡單的圖形用戶界面,我的其他結構良好的協議庫變得需要比我原本想要花費更多的時間和代碼.. –