2014-02-14 92 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