2012-01-18 101 views
3

我一直在試圖瞭解如何添加一個進度條,我可以在GUI中創建一個我正在實現並使其顯示,但即​​使通過http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html檢查後,我仍然沒有更清楚如何將方法設置爲任務,以便我可以創建運行方法的進度條。請有人可以嘗試向我解釋這一點,或者發佈GUI中使用的進度條示例,並將任務設置爲方法。謝謝。如何添加進度欄?

+1

一個答案在這[可以在主類之外的類中使用進度條嗎?](http://stackoverflow.com/questions/4637215/can-a-progress-bar-be-used-in-a-class-outside-主)可能有所幫助。 – trashgod 2012-01-18 19:44:38

+0

我不明白。爲什麼你想創建一個運行方法的進度條**(如你所說)?進度條的目標是向用戶提供有關正在運行的任務的信息。所以在oracle doc中告訴的任務指的是將管理進度條的線程。因此,使用揮杆工具創建進度條(如鏈接所示),然後在(長?)任務中更新該進度條。 SwingWorker的'doInBackground()'方法用於管理進度條。我建議你再看一下你的oracle tuto,解釋很清楚,例子可重用。祝你好運! – 2012-01-18 19:56:25

回答

11

也許我可以幫你一些示例代碼,一個類似的例子:

public class SwingProgressBarExample extends JPanel { 

    JProgressBar pbar; 

    static final int MY_MINIMUM = 0; 

    static final int MY_MAXIMUM = 100; 

    public SwingProgressBarExample() { 
    // initialize Progress Bar 
    pbar = new JProgressBar(); 
    pbar.setMinimum(MY_MINIMUM); 
    pbar.setMaximum(MY_MAXIMUM); 
    // add to JPanel 
    add(pbar); 
    } 

    public void updateBar(int newValue) { 
    pbar.setValue(newValue); 
    } 

    public static void main(String args[]) { 

    final SwingProgressBarExample it = new SwingProgressBarExample(); 

    JFrame frame = new JFrame("Progress Bar Example"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(it); 
    frame.pack(); 
    frame.setVisible(true); 

    // run a loop to demonstrate raising 
    for (int i = MY_MINIMUM; i <= MY_MAXIMUM; i++) { 
     final int percent = i; 
     try { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
      it.updateBar(percent); 
      } 
     }); 
     java.lang.Thread.sleep(100); 
     } catch (InterruptedException e) { 
     ; 
     } 
    } 
    } 
} 
4

你的問題有點含糊,但在我看來,你想讓進度條顯示特定運行方法的進度,我將其稱爲「work()」方法。不幸的是,沒有辦法只將方法的引用傳遞給進度條 - 你的方法需要明確地告訴進度條顯示什麼。這是我會做:

  1. 製作進度條的參考提供給工作() - 無論是把它作爲一個參數對(),或提供一個訪問方法,你在工作代碼()可以調用獲得對進度條的參考。在你獲得對進度條(我將稱之爲「pb」)的引用後,調用pb.setMinimum(0)和pb.setMaximum(n),其中n是數字。的步驟你的方法具有打通

  2. 作爲你的方法完成的每個步驟,呼叫pb.setValue(pb.getValue()+ 1);

  3. 在你的方法結束時,呼叫PB。 setValue(0);在返回之前重置進度條

此外,如果你想讓你的進度條顯示一條String消息,你首先必須調用pb.setStringPainted(true),隨後調用pb.setString(string)將顯示在進度條上。

2

請參閱my answer on another SO question其中包括JProgressBar的示例,該示例通過使用SwingWorker進行更新。 SwingWorker用於在後臺執行長時間運行的任務(例如,它只是一個常規的Thread.sleep),並以特定的時間間隔報告進度。

我也強烈建議看看Swing concurrency tutorial以獲得更多背景信息,說明爲什麼在執行干擾UI的長時間運行任務時應該使用SwingWorker

因爲我張貼的一個可用的Swing tutorial about JProgressBars,它也值得一