【问题标题】:Java progressbar feedingJava 进度条馈送
【发布时间】:2014-02-16 07:27:33
【问题描述】:

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

当 sql1.createExcel() 完全完成并在定义的位置下创建 excel 文件时,progressbar jframe 填充 pbar 但 bar 没有进度。但是我用progressbar.updateBar(newvalueforpbar)提供pbar;在每个 while 语句结束之后。

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

提前致谢。

【问题讨论】:

    标签: java swing progress-bar


    【解决方案1】:

    您正在同一个线程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;
            }
        }
    

    在你的客户端代码中,你有progressBar:

    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

    【讨论】:

    • 首先感谢您的 cmets。我在 javacreed 网站上阅读了文章。真的是非常好的文章。我开始基本了解逻辑。但是有时我的英语还不够:(您能否提供一个示例代码,用于从任何数据库检索多个结果集并在 pbar 上进行两次?谢谢。
    • @Lacrymae 我添加了一个简单的例子
    • 我在我的项目中模拟了你的例子,但是当我调用 doInBackground();从butoon行动的工作,主要gui仍然不负责任。我这样称呼该方法;工人 workerstart = new Worker();试试 {workerstart.doInBackground(); } catch (Exception ex) { Logger.getLogger(MainProgramWindow.class.getName()).log(Level.SEVERE, null, ex); }
    • @Lacrymae 你不必调用 doInBackGround.. 你必须使用 execute() 来让 swingWorker 工作,记住 swingWorker 的实例只能执行一次!
    • 哦,谢谢你的技巧。现在我的项目成功地负责并更新了进度条。非常感谢:)
    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2015-08-11
    相关资源
    最近更新 更多