有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java发布/处理会让SwingWorker变慢

我试着用SwingWorker更新进度条。对我来说没什么新鲜事。我有点懒,所以没有重写process方法。下面是一个简化的例子:

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

在me PC上,将进度条更新为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));
}

但是现在使用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));
        }
    }
}

谢谢你的建议


共 (1) 个答案

  1. # 1 楼答案

    你不应该发布每一个变化,但可能每10个:

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