我正在尝试在我的挥杆代码中使用进度条。它运行良好,但我可以在执行完成后重置为零。这是我的代码逻辑,用于获取用户输入并调用相应的方法。
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);
}
}
});
答案 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
的新实例时自动重新设置进度条的种子并执行它...