java - JProgress Bar 未在 SwingWorker 内更新

标签 java swing jprogressbar

我很抱歉添加了许多 JProgressBar 更新问题,但这确实让我发疯。

我有一个通过 SwingWorker 更新的 JProgressBar,但我仍然遇到完成后更新栏的典型问题。

相关代码如下:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.*;

public class SwingTest {

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                init();
            }
        });
    }

    public static void init() {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JProgressBar bar = new JProgressBar();

        JButton button = new JButton("Start");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                bar.setMaximum(100);
                bar.setValue(0);

                SwingWorker worker = new SwingWorker<String, Void>()
                {
                    @Override
                    public String doInBackground()
                    {
                        int val = 0;
                        // +1 to make inclusive
                        for (int i = 0; i < 100; i++)
                        {
                            try
                            {
                                Thread.sleep(50);
                            } catch (InterruptedException e)
                            {
                                e.printStackTrace();
                            }

                            setProgress(++val);
                        }

                        return "Hello SwingWorker World";
                    }

                    @Override
                    public void done()
                    {
                    }
                };

                worker.addPropertyChangeListener(
                        new PropertyChangeListener()
                        {
                            public  void propertyChange(PropertyChangeEvent evt)
                            {
                                if ("progress".equals(evt.getPropertyName()))
                                {
                                    bar.setValue((Integer)evt.getNewValue());
                                }
                            }
                        }
                );

                worker.execute();

                try
                {
                    System.out.println("Return: " + worker.get().toString());
                } catch (InterruptedException e1)
                {
                    e1.printStackTrace();
                    System.out.println("Failed.");
                } catch (ExecutionException e1)
                {
                    e1.printStackTrace();
                    System.out.println("Failed.");
                }
            }
        });

        panel.add(button);
        panel.add(bar);

        frame.add(panel);
        frame.pack();
        frame.setSize(200,90);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

如果问题可能是由于另一部分造成的,如果需要,我将使用更多代码编辑我的问题。

提前致谢。

编辑:将代码精简为最小产品。

最佳答案

嗯,我不知道你的代码到底在做什么,但我没有在你的代码中看到任何有“延迟”的地方。

因此,循环继续执行,所有绘制请求都合并为一个请求,因此您只能看到最终值。

您只需在 setProgress(...) 方法后添加 Thread.sleep() 即可验证这是否是问题所在。

如果是这种情况,问题是为什么要使用进度条,因为代码执行得如此快。

阅读 Swing 教程中关于 How to Use Progress Bars 的部分并从工作演示开始。然后,您可以修改工作代码以查看更改后会发生什么。

关于java - JProgress Bar 未在 SwingWorker 内更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38792552/

相关文章:

java - TextView 不同步

java - JComboBox 让 GUI 消失

java - 更新 jprogress-bar

java - 如何播放很多音效?

java - 线程问题,无法更改外部 TextView 的值

java - 如何在Java中修改或添加JComboBox中的项目

java - Swing drawString : Text bounds and line wrapping

java - JProgressbar 应该如何工作?

java - 读取大文本文档并在读取时填充 JProgressBar

java - ''s cannot be resolved' ' 如何解决此错误?