方法完成java swing后,将进度条重置为零

时间:2013-12-04 10:11:41

标签: java swing progress-bar

我正在尝试在我的挥杆代码中使用进度条。它运行良好,但我可以在执行完成后重置为零。这是我的代码逻辑,用于获取用户输入并调用相应的方法。

    final JProgressBar progressBar = new JProgressBar();

        btnRun = new JButton("Run");
        btnRun.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                btnRun.setEnabled(false);

                if (textStartDate.getText().length() == 0 ||textEndDate.getText().length() == 0 ||textField.getText().length() == 0
                        || textField_1.getText().length() == 0) {
                    JOptionPane.showMessageDialog(frame,"Please Enter all fields");
                    }
//              else if(minDate.compareTo(maxDate)>0 ){
//                      JOptionPane.showMessageDialog(frame,"Starting Date should be lesser then end Date");
//                  }
                else{
                    ArrayList<String> ss = list.listFiles(fSource,
                            textStartDate.getText(), textEndDate.getText());
                    for (String string : ss) {
                        i++;
                        progressBar.setMaximum(i);
                        System.out.println(i);

                        progressBar.setValue(i);

                        System.out.println(textField.getText().replace('\\', '/'));
                        list.writeToFolder(ftarget, string);
                    }

                    btnRun.setEnabled(true);

                }

            }

        });

2 个答案:

答案 0 :(得分:1)

将值设置为0,如下所示:

progressBar.setValue(0);
progressBar.setMaximum(0);
progressBar.setString("");

答案 1 :(得分:1)

你遇到的主要问题是你在事件调度线程的上下文中运行一个循环,这将阻止它进行处理,除其他外,绘制请求。

这意味着在退出actionPerformed方法之前,进度条实际上不会更新。

有许多可能的解决方案,但最简单的方法是使用SwingWorker,这将允许您在后台线程中运行循环,但是能够提供进度更新以及将更新重新同步回EDT。

请查看Concurrency in Swing了解详情

例如......

我也会专注于将最大值保持为静态值,例如......

progressBar.setValue(0);    
progressBar.setMaximum(100);

//... Within the SwingWorker...

ArrayList<String> ss = list.listFiles(fSource,
                        textStartDate.getText(), textEndDate.getText());
for (String string : ss) {
    i++;    
    int progress = (int)(((float)i / (float)ss.size()) * 100f);
    setProgress(progress);
    //...
}

例如。它会使进度条实际上进展,否则它将始终显示为100%(因为i既是值又是maximum)。

这将在您下次创建SwingWorker的新实例时自动重新设置进度条的种子并执行它...