如何更改进度条和标签的值?[英] How to change value of progress bar and label?

问题描述

JLabel 和 JProgressBar 不会改变它们的值,只有在方法结束时才会改变.

this.desSave.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        DownloadXml();
    }
});

private void DownloadXml() throws Exception {
    Integer a = 456;
    int value = (1000 / a) - 1;
    this.numDes.setText("0" + "/" + a);
    for (int i = 0; i < a; i++) {
        saveXml(ligas.get(i),i,path);
        this.numDes.setText(i + "/" + a); //this is a jlabel
        this.progressbar.setValue(value * i); //jprogressbar
    }
}

private void SaveXml(String xml,int a,String path) throws IOException {
}

推荐答案

您正在阻塞事件调度线程,这会阻止它更新 UI.您可以使用 Thread,但 Swing 是单线程 API,这意味着只能从事件调度线程的上下文中对 UI 进行更新.

您可以使用 SwingWorker,它允许您在后台线程中执行长时间运行的进程,但它支持安全地同步更新到 UI.

加上它的 progress 和 PropertyChange 支持,例如,它变得易于管理.

public class Worker extends SwingWorker<Object, Object> {

    @Override
    protected Object doInBackground() throws Exception {

        // The download code would go here...
        for (int index = 0; index < 1000; index++) {

            int progress = Math.round(((float)index / 1000f) * 100f);
            setProgress(progress);

            Thread.sleep(10);

        }

        // You could return the down load file if you wanted...
        return null;

    }
}

"进度窗格"

public class ProgressPane extends JPanel {

    private JProgressBar progressBar;

    public ProgressPane() {

        setLayout(new GridBagLayout());
        progressBar = new JProgressBar();

        add(progressBar);

    }

    public void doWork() {

        Worker worker = new Worker();
        worker.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if ("progress".equals(evt.getPropertyName())) {
                    progressBar.setValue((Integer) evt.getNewValue());
                }
            }

        });

        worker.execute();

    }

}

您可以使用对 EDT 的 publish/process 支持和更新、PropertyChange 支持或 worker 的 done 方法从 EDT 中获取安全完成时 worker 的结果

本文地址:https://www.itbaoku.cn/post/978618.html

相关标签/搜索