Java 进度条反馈

标签 java swing progress-bar

我有 MainProgramWindow GUI。该GUI有一些变量和一键调用Sql类的createExcel方法并同时启动进度条。

    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中按下createExcelButon时,sql1.createExcel()方法成功执行并开始工作,我的进度条也出现了。但只有进度条的 jframe 未填充 bpar,并等待 sql1.createExcel() 完全完成。

当 sql1.createExcel() 完全完成并在定义的位置创建 Excel 文件时,进度条 jframe 填充了 pbar,但进度条没有进度。但我用progressbar.updateBar(newvalueforpbar);给pbar喂食在每个 while 语句结束之后。

P.S:如果我从按钮中删除 pbar 调用,我的程序将成功运行并创建具有所需格式的 Excel 文件。我的问题是进度条喂食。

提前致谢。

最佳答案

您正在同一线程中执行所有任务The Event Dispatch Thread 。解决这个问题的一个好方法是在单独的线程中执行业务代码,这样就不会阻塞 gui,并且您可以更新 gui,而无需等待业务代码完成。 Swing 提供 SwingWorker类来实现这一点。这里有一个带有进度条的很好的例子。 Swing Worker Example .

了解更多 How to Use Progress Bars .

简单来说,您所做的就是创建一个 swingWorker 子类并重写 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

关于Java 进度条反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21779825/

相关文章:

java - 如何打开具有预定义大小的 JFileChooser

html - 响应式进度条

php - 在带有进度条的浏览器中上传大文件,更喜欢没有 flash,只有 js 和 php

python - kivy:带有进度条的弹出窗口

java - 用于个人测试的 Grails 中的 Spock 单元测试在 intellij 中不起作用

java - 是否可以在 Hibernate 中在 Postgres 中的表和 View 之间创建自定义的一对一关系?

java - 删除重复的项目 JComboBox

java - 如何在 JTable 中呈现 JTable?

java - 良好的 hashCode() 实现

java - 二叉树数组迭代