Java 方法完成后将进度条重置为零
我试图在swing代码中使用进度条。它运行良好,但我可以在执行完成后重置为零。下面是我的代码逻辑,用于获取用户输入并调用相应的方法Java 方法完成后将进度条重置为零,java,swing,progress-bar,Java,Swing,Progress Bar,我试图在swing代码中使用进度条。它运行良好,但我可以在执行完成后重置为零。下面是我的代码逻辑,用于获取用户输入并调用相应的方法 final JProgressBar progressBar = new JProgressBar(); btnRun = new JButton("Run"); btnRun.addActionListener(new ActionListener() { @Override
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),但它不起作用。可能是我输入了错误的循环。。。哦,天哪,我没看到。。。