2013-12-10 14 views
0

我有數據存儲在Jtable中,然後我逐行取出這些數據並將此數據傳遞給數據庫中的可調用過程(每次調用1次),並且過程返回該消息一旦完成,這個過程需要幾乎1-2分鐘的每個電話,有人可以告訴我如何顯示整個過程的單個進度欄。 (我的意思是所有通話都有一個進度條),我希望一旦循環結束,進度條就完成了。如何顯示過程調用的進度欄

我的代碼如下:

DefaultTableModel model = (DefaultTableModel) data.getModel(); 
for (int count = 0; count < model.getRowCount(); count++) { 
    CallableStatement csmt = con.prepareCall("{call CODE_REVIEW.PRC_WRAPPER_REVIEW(?,?,?,?)}"); 

    String folder=model.getValueAt(count, 0).toString(); 
    String type=model.getValueAt(count, 1).toString(); 
    String name=model.getValueAt(count, 2).toString(); 

    csmt.setString(1,name); 
    csmt.setString(2,type); 
    csmt.setString(3,folder); 
    csmt.registerOutParameter(4,java.sql.Types.VARCHAR); 
    csmt.execute(); 
    String messege =csmt.getString(4); 
} 
+0

爲此,您必須瞭解EDT(Event Dispatch Thread)的含義並使用線程執行循環並更新GUI中的進度條。通常使用SwingWorker線程,因爲它很容易實現。 – HpTerm

+0

你應該在這裏檢查我舉的例子:http://stackoverflow.com/questions/10773552/jprogressbar-update-from-swingworker – HpTerm

回答

3

可以使用SwingWorker做在後臺調用並更新Event Dispatching Thread(又名EDT)的進度條。事情是這樣的:

SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() { 
    @Override 
    protected Void doInBackground() throws Exception { 
     int processed = 0; 
     DefaultTableModel model = (DefaultTableModel) data.getModel(); 
     for (int count = 0; count < model.getRowCount(); count++) { 
      //... 
      String messege = csmt.getString(4); 
      processed++; 
      publish(processed/model.getRowCount() * 100); 
     } 
     return null; 
    } 

    @Override 
    protected void process(List<Integer> list) { 
     progressBar.setValue(list.get(list.size() - 1)); 
    } 
}; 
worker.execute(); 

看看到Worker Threads and SwingWorkerConcurrency in Swing蹤跡。

+1

+1比我快,只是要發佈幾乎相同的代碼示例 – HpTerm

+0

謝謝!和+1在你那個偉大的問題:) @HpTerm – dic19