[英]JProgressBar.setMaximum(int) sometimes doesn't seems to work
我有一个JProgressBar,每次完成队列任务时,我需要使用以下代码设置新的minimum
, maximum
和progress
值:
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.