我已尝试使用SwingWorker更新进度条。没什么新鲜的。我有点懒,所以我没有覆盖过程方法。这是一个简化的例子:
protected Void doInBackground() throws Exception {
for (int i = 0; i < 10000; i++) {
progressBar.setValue(i+1);
}
return null;
}
在我的PC上,将progess栏更新为100%需要大约6秒钟。这是星期五,所以我想让我们以经常描述的不同方式来做。让我们使用发布和处理方法来更新进度条:
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < maximum; i++) {
publish(i+1);
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
progressBar.setValue(chunks.get(chunks.size()-1));
}
但是现在使用发布方法,将进度条更新为100%需要21(而不是6)秒。
为什么?
这里是整个代码(带有“开始”按钮和进度条的框架):
public class Gui extends JFrame {
public static void main(String[] args) {
new Gui();
}
public Gui() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JProgressBar progressBar = new JProgressBar();
progressBar.setStringPainted(true);
JButton btnStart = new JButton("Start");
btnStart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MySwingWorker(progressBar).execute();
}
});
getContentPane().setLayout(new BorderLayout(3, 3));
getContentPane().add(btnStart, BorderLayout.CENTER);
getContentPane().add(progressBar, BorderLayout.SOUTH);
pack();
setVisible(true);
setLocationRelativeTo(null);
}
private class MySwingWorker extends SwingWorker<Void, Integer> {
private final int MAXIMUM = 100000000;
private final JProgressBar progressBar;
public MySwingWorker(JProgressBar progressBar) {
this.progressBar = progressBar;
this.progressBar.setMaximum(MAXIMUM);
this.progressBar.setValue(0);
}
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < MAXIMUM; i++) {
//----------------------------------
// TOGGLE BETWEEN THESE LINES:
//progressBar.setValue(i+1);
publish(i + 1);
//-----------------------------------
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
progressBar.setValue(chunks.get(chunks.size() - 1));
}
}
}
感谢您的建议......
答案 0 :(得分:1)
您不应该发布每一个更改,但可能每10个发布一次:
for (int i = 0; i < maximum; i++) {
doTheWork();
if(i % 10 == 0) {
publish(i+1);
}
}
publish(maximum);