我目前正在解决以下问题:当点击开始按钮时,如何使用一个线程来填充进度条(一步一步的)。
public class event implements ActionListener{
@Override
public void actionPerformed(ActionEvent ae) {
Try t = new Try(250);
Thread MyT = new Thread(t);
MyT.start();
try {
MyT.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
}
pr.setValue(pr.getValue()+25);
System.out.println("check");
try {
MyT.sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
}
pr.setValue(pr.getValue()+25);
System.out.println("check");
}
}
这里的问题是,我希望在500毫秒后填满25个单位,然后在5000毫秒后再次填满其他25个单位(一步一步)。但我的程序却在500毫秒后不填入25个单位,而是在5000毫秒后填入50个单位。为什么会这样,我怎样才能在不修改线程类的情况下,使条形图逐渐充满?
是的,我知道这个问题是老问题了,但也许它能帮助别人。
我已经实现了一个进度条类,它提供了一个简单的方法,在指定的时间内将进度条填充到某个值。
像这样使用。
// create progress bar
ProgressBar progressbar = new ProgressBar();
// fill progress bar in steps each one second
progressbar.fillInMills(1000, 25);
progressbar.fillInMills(1000, 50);
progressbar.fillInMills(1000, 75);
progressbar.fillInMills(1000, 100);
// resets to zero
progressbar.reset();
import javax.swing.JProgressBar;
public class ProgressBar extends JProgressBar {
Thread thread;
final int MAX = 100;
final int MIN = 0;
public ProgressBar() {
super(HORIZONTAL);
setMinimum(MIN);
setMaximum(MAX);
}
/**
* Fills the progress bar to the specified level in the specified time.
*
* @param millis the time in milliseconds
* @param fillTo the level in percentage
*/
public void fillInMills(final int millis, final int fillTo) {
thread = new Thread(() -> {
try {
final int startAt = getValue();
final int timeBetweenSteps = millis / Math.max(fillTo - startAt, 1);
for (int i = startAt; i <= fillTo; i++) {
setValue(i);
Thread.sleep(timeBetweenSteps);
}
} catch (final InterruptedException ignored) {
// thread is cancelled
}
});
thread.start();
}
/**
* Resets the ProgressBars level to zero.
*/
public void reset() {
if (thread != null) {
thread.interrupt();
}
this.setValue(0);
}
}
如果你需要JProgressBar的高级功能,请看这个。Oracle进度条教程 详细的信息。