2014-02-14 135 views
1

我有MainProgramWindow GUI。這個GUI有一些變量和一個按鈕調用Sql類的createExcel方法,並同時啓動進度條。Java進度條上傳

public class MainProgramWindow extends javax.swing.JFrame { 

    package AgentStatGenerator; 
    //Rest of code. 

     class Sql { 

     //Rest of code.  
      public int newvalueforpbar = 0; 
      SwingProgressBarExampleOLD2 progressbar = new SwingProgressBarExampleOLD2(); 

      public void createExcel() { 

      try{ 
      //Rest of code. 

      stmt = con.createStatement(); 
      rs1 = stmt.executeQuery(query1); 

      while (rs1.next()) { 
       HSSFRow row2 = sheet.createRow((short) index); 
       Cell cell100 = row2.createCell((short) 0); 
       cell100.setCellValue(rs1.getString(1)); 
       cell100.setCellStyle(stylersinfo); 
       Cell cell101 = row2.createCell((short) 1); 
       cell101.setCellValue(rs1.getInt(2)); 
       cell101.setCellStyle(stylersthousand); 
       Cell cell102 = row2.createCell((short) 2); 
       cell102.setCellValue(rs1.getDouble(3)); 
       cell102.setCellStyle(stylersdouble); 
       index++; 
       newvalueforpbar = 50; 
       progressbar.updateBar(newvalueforpbar); 
       } 

      rs2 = stmt.executeQuery(query2); 

      while (rs2.next()){ 
       HSSFRow row3 = sheet.createRow((short) index); 
       Cell cell103 = row3.createCell((short) 0); 
       cell103.setCellValue(rs2.getString(1)); 
       cell103.setCellStyle(stylersinfo); 
       Cell cell104 = row3.createCell((short) 1); 
       cell104.setCellValue(rs2.getInt(2)); 
       cell104.setCellStyle(stylersthousand); 
       Cell cell105 = row3.createCell((short) 2); 
       cell105.setCellValue(rs2.getDouble(3)); 
       cell105.setCellStyle(stylersdouble); 
       index++; 
       newvalueforpbar = 100; 
       progressbar.updateBar(newvalueforpbar); 

       } 

      catch(Exception ex){  
      JOptionPane.showMessageDialog(null, ex.toString()); 
        } 
       } 

     } 


     } 

    private void createExcelButonActionPerformed(java.awt.event.ActionEvent evt) {             
    Sql sql1 = new Sql(); 
    SwingProgressBarExampleOLD2 progressbar = new SwingProgressBarExampleOLD2(); 
    progressbar.startProgress(); 
    sql1.createExcel(); 
    } 
} 

我SwingProgressBarExampleOLD2類

package AgentStatGenerator; 

import java.lang.reflect.Constructor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingUtilities; 

/** 
* 
* @author Lacrymae_Ev 
*/ 
public class SwingProgressBarExampleOLD2 extends JPanel { 

    JProgressBar pbar; 

    static final int MY_MINIMUM = 0; 

    static final int MY_MAXIMUM = 100; 

    public SwingProgressBarExampleOLD2() { 
    // 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 void startProgress() { 

    final SwingProgressBarExampleOLD2 it = new SwingProgressBarExampleOLD2(); 

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

    } 
} 

我,當我在MainProgramWindow GUI,sql1.createExcel()按createExcelButon方法成功地eecuted,開始也正在我的進度條出現。但是隻有progresbar的jframe沒有填充bpar,並且等到sql1.createExcel()完全完成。

當sql1.createExcel()完全完成並在定義的位置下創建excel文件時,進度條jframe填充了pbar但bar沒有進展。但我用進度欄feedbar.updateBar(newvalueforpbar);在每個聲明結束之後。 P:如果我從我的按鈕刪除pbar調用,我的程序工作成功,並創建與所需格式的Excel文件。我的問題是進度條餵養。

在此先感謝。

回答

1

您正在執行同一線程中的所有任務The Event Dispatch Thread。解決該問題的一個好方法是在單獨的線程中執行業務代碼,以便不會阻止gui,並且可以在不等待業務代碼完成的情況下更新您的gui。 Swing提供SwingWorker類來實現這一點。在這裏你有一個progressBar的好例子。 Swing Worker Example

瞭解更多How to Use Progress Bars

在一個簡單的你做的是做一個swingWorker sublcass並覆蓋doInBackGround()

例子:

public class Worker extends SwingWorker<Void, Void> { 

     @Override 
     protected Void doInBackground() throws Exception { 
      //here you make heavy task this is running in another thread not in EDT 
      int i = 0; 
      setProgress(i); 
      // call query 1 
      while(i < 50){ 
      setProgress(i++); 
      Thread.sleep(5); // random magic number 
      } 
      // then call query 2 
      while(i <= 100){ 
      setProgress(i++); 
      Thread.sleep(5); // random magic number 
      } 

      return null; 
     } 
    } 

而且在你有進度條客戶端代碼:

SwingWorker myWorker = new Worker(); 
myWorker.addPropertyChangeListener(new PropertyChangeListener() { 
    @Override 
    public void propertyChange(final PropertyChangeEvent event) { 
    switch (event.getPropertyName()) { 
    case "progress": 
     myProgressBar.setIndeterminate(false); 
     myProgressBar.setValue((Integer) event.getNewValue()); 
     break; 
    } 
} 
}); 
//then to get start you have to use execute() 
worker.execute(); 

在這裏,你有你的意見的example和另一one

+0

首先感謝。我在javacreed網站閱讀文章。真的很好的文章。我從根本上開始理解邏輯。但是,我的英語是不夠的有時:(你可以給一個示例代碼多個結果集從任何數據庫檢索和進步pbar兩次?謝謝。 – Lacrymae

+0

@Lacrymae我添加了一個簡單的例子 – nachokk

+0

我模擬你的例子在我的項目,但是當我調用doInBackground();從butoon動作開始,主要gui仍然是不負責任的,我用這種方式調用方法; worker workerstart = new Worker(); try { .getLogger(MainProgramWindow.class.getName()).log(Level.SEVERE,null,ex); } – Lacrymae