Java 方法完成后将进度条重置为零

Java 方法完成后将进度条重置为零,java,swing,progress-bar,Java,Swing,Progress Bar,我试图在swing代码中使用进度条。它运行良好,但我可以在执行完成后重置为零。下面是我的代码逻辑,用于获取用户输入并调用相应的方法 final JProgressBar progressBar = new JProgressBar(); btnRun = new JButton("Run"); btnRun.addActionListener(new ActionListener() { @Override

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

    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);

                }

            }

        });
final JProgressBar progressBar=新的JProgressBar();
btnRun=新的JButton(“Run”);
添加ActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
btnRun.setEnabled(false);
如果(textStartDate.getText().length()==0 | | textEndDate.getText().length()==0 | | | textField.getText().length()==0
||textField_1.getText().length()==0){
showMessageDialog(框架“请输入所有字段”);
}
//如果(minDate.compareTo(maxDate)>0),则为else{
//showMessageDialog(框架,“开始日期应小于结束日期”);
//                  }
否则{
ArrayList ss=list.listFiles(fSource,
textStartDate.getText(),textEndDate.getText());
for(字符串:ss){
i++;
进度条设置最大值(i);
系统输出打印LN(i);
progressBar.setValue(i);
System.out.println(textField.getText().replace('\\','/');
list.writeToFolder(ftarget,string);
}
btnRun.setEnabled(真);
}
}
});

将值设置为
0
如下所示:

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

您遇到的主要问题是在事件调度线程的上下文中运行循环,这将阻止它处理绘制请求等

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

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

请查看以了解更多详细信息

例如

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);
    //...
}
我还将把重点放在将最大值保持为静态值上,例如

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);
    //...
}
progressBar.setValue(0);
进度条设置最大值(100);
//... 在SwingWorker中。。。
ArrayList ss=list.listFiles(fSource,
textStartDate.getText(),textEndDate.getText());
for(字符串:ss){
i++;
int进程=(int)((浮点)i/(浮点)ss.size())*100f);
设定进度(进度);
//...
}
比如说。它将使进度条实际前进,否则它将始终显示为100%(因为
i
是值和
最大值)


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

回答:使用
设置值(0)
。不要担心使用
setMaximum
,而是将其保留在
100
,只需计算进度百分比-
(int)(((double)i/(double)ss.size())*100d)
,并将其用作值…我尝试使用setValue(0),但它不起作用。可能是我输入了错误的循环。。。哦,天哪,我没看到。。。