作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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));
关于java - JProgressBar.setMaximum(int) 有时似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25364587/
我有一个 JProgressBar,每次完成队列任务时,我需要设置新的 minimum、maximum 和 progress 值,使用下面的代码: this.progressBar.setMinimu
给定一个已经设置了最小值/值/最大值的 NSStepper,如果我将最小值设置为 value 和最大值之间的值,NSStepper 的值会改变吗? 我知道我可以尝试一下,但这只能告诉我当前的操作系统,
我是一名优秀的程序员,十分优秀!