java - JProgressBar.setMaximum(int) 有时似乎不起作用

标签 java swing jprogressbar

我有一个 JProgressBar,每次完成队列任务时,我需要设置新的 minimummaximumprogress 值,使用下面的代码:

this.progressBar.setMinimum(minimum);
this.progressBar.setMaximum(maximum);
this.progressBar.setValue(progress);

但是,我注意到有时,setMaximum(int) 方法似乎不起作用,因为进度条仍然使用旧的最大值。

然后我编写了一些测试代码并运行它:

progressBar.setMaximum(10);
System.out.println(progressBar.getMaximum());

有时它会按预期打印 10,有时会打印旧值:与 10 不同的任何值。

我在 Google 和 javadocs 上花了几个小时,尝试在 JProgressBar 的父级上调用 revalidate()repaint(),但什么也没有。我还尝试调用 Thread.sleep(10) 来等待 AWT 线程运行其他任务,但没有成功。

有什么想法吗?

编辑:提供了更多代码:

/* Applet that construct the view and init a Thread. */
public class FastApplet extends Applet {
    private JProgressBar progressBar;
    private JPanel panel;
    private Runnable runnable;

    @Override
    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                @Override
                public void run() {
                    createAndShowGUI();
                    initThreads();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void createAndShowGUI() {
        panel = new JPanel();
        progressBar = new JProgressBar();
        progressBar.setStringPainted(true);
        panel.add(progressBar);
    }

    private void initThreads() {        
        runnable = new MyRunnable(progressBar);     
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

/* Runnable that update progress and call setMaximum(int) on JProgressBar */
public class MyRunnable {
    private int progress;
    private final JProgressBar progressBar;

    MyRunnable(JProgressBar progressBar) {
        this.progressBar = progressBar;
    }

    @Override
    public void run() {
        // do the tasks and update the progressBar using progressBar.setValue(progress)
        // when done, reset the progress bar with the a new maximum:
        defineNewProgressBar(0, 0, newMaximum);
    }

    public void defineNewProgressBar(int progress, int minimum, int maximum) {
        this.progress = progress;

        Component component = progressBar.getParent();
        JPanel panel = (JPanel) component;

        this.progressBar.setMinimum(minimum);
        this.progressBar.setMaximum(maximum);
        this.progressBar.setValue(progress);

        panel.revalidate();
        panel.repaint();
    }
}

最佳答案

您在评论中写道,您不是从 EDT 调用 setMaximum()。您应该从 EDT 中调用它,如下所示:

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        progressBar.setMaximum(10);
    }
});

如果您使用 Java8,则可以使用 lambda 表达式来完成此操作:

SwingUtilities.invokeLater(()->progressBar.setMaximum(10));

关于java - JProgressBar.setMaximum(int) 有时似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25364587/

相关文章:

Java JFrame - 添加标签图像

java - 带有 JProgressBar 的 JDialog

java - 将 json URL 导入 java 并使用 jackson 库解析它

使用对象和基元的 java 函数

java - 为什么接口(interface)不实现方法并重写它们?

java - 如何延迟Java代码直到另一部分代码完成?

java - 容器中的 Servlet 实例

java - 制作一个可以从另一个类打印的文本区域

java - Jdialog 框中的 Jprgressbar 未更新

Java上传百分比进度条线程