java - JProgressBar 没有完全填满

标签 java swing swingworker jprogressbar

我有一个 JProgressBar,我已将其最大值设置为 150。使用 javax.swing.Timer,我更新进度条并增加 time 变量减 1。问题是,一旦 time 达到 100,进度条将不再更新,并保持在如下所示的位置:

JProgressBar 2/3 filled

为什么会出现这种情况?有什么办法可以解决这个问题吗?

public class Test {
    int time = 0, duration = 150;
    JProgressBar progressBar;
    Timer timer;

    public Test() {
        GridBagLayout layout = new GridBagLayout();
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.BOTH;

        JFrame frame = new JFrame();
        frame.setLayout(layout);
        constraints.gridwidth = GridBagConstraints.REMAINDER;

        timer = new Timer(98, new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                time++;

                if (time == duration) {
                    time = 0;
                    timer.stop();
                }
            }
        });
        timer.start();

        progressBar = new JProgressBar(0,duration);
        progressBar.setValue(0);
        progressBar.setStringPainted(false);
        layout.setConstraints(progressBar,constraints);
        frame.add(progressBar);


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        ProgressBarUpdater pbUpdater = new ProgressBarUpdater();
        pbUpdater.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent ev) {
                progressBar.setValue(time);
            }
        });
        pbUpdater.execute();
    }

    public static void main(String[] args) {
        new Test();
    }

    public class ProgressBarUpdater extends SwingWorker<Void,Void> {
        @Override
        public Void doInBackground() {
            setProgress(0);
            while (time <= duration)
                setProgress(Math.min(time,duration));
            return null;
        }
    }
}

最佳答案

您的问题是,worker 中的 setProgress() 范围为 0 到 100。

进行此更改,它将按预期工作:

public class ProgressBarUpdater extends SwingWorker<Void,Void> {
    @Override
    public Void doInBackground() {
        setProgress(0);
        while (time <= duration)
            setProgress((Math.min(time,duration) * 100) / duration); // convert to percent
        return null;
    }
}

关于java - JProgressBar 没有完全填满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431633/

相关文章:

java - 将 JScrollPane 添加到 JList

java - Swing 在作业运行时更新 UI 组件

java - 创建登录表单并将密码从隐藏更改为可见

java - 在按下另一个 Activity 的按钮时清除 recyclerview

java - 将图像从一个面板移动到另一个面板

java - 如何使用JAVA跨多个窗口(不同的jframe)处理事件?

Java通过 protected getter访问私有(private)父类(super class)成员

java - 连接到在 Docker 中运行的远程 EJB 模块

java - 将另一个程序的输出打印到 java 文本区域

java - 从结果集中填充表时更改 jtable 的列类型