繁体   English   中英

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

[英]JProgressBar.setMaximum(int) sometimes doesn't seems to work

我有一个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));

您可以使用SafeProgressBarUpdaterThread

    progressBarUpdater = new SafeProgressBarUpdaterThread(progressBar);
     //...
    progressBarUpdater.setMaximum(maximum);
    progressBarUpdater.setValue(value);
    java.awt.EventQueue.invokeLater(progressBarUpdater);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM