gpt4 book ai didi

java - 发布/处理使 SwingWorker 变慢

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:56 26 4
gpt4 key购买 nike

我已经尝试使用 SwingWorker 来更新进度条。对我来说没什么新鲜事。我有点懒,所以我没有重写 process 方法。这里有一个简化的例子:

protected Void doInBackground() throws Exception {
for (int i = 0; i < 10000; i++) {
progressBar.setValue(i+1);
}
return null;
}

在我的 PC 上,将进度条更新到 100% 大约需要 6 秒。今天是星期五,所以我想让我们像经常描述的那样以不同的方式来做。让我们使用 publish 和 process 方法来更新进度条:

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

但现在使用 publish 方法需要 21(而不是 6)秒才能将进度条更新到 100%。

为什么?

这里是完整的代码(带有“开始”按钮和进度条的框架):

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

感谢您的建议...

最佳答案

您不应该发布每一个更改,但也许每 10 次发布一次:

for (int i = 0; i < maximum; i++) {
doTheWork();
if(i % 10 == 0) {
publish(i+1);
}
}
publish(maximum);

关于java - 发布/处理使 SwingWorker 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13767020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com