我想更改进度条使用SetValue(int),但它不起作用,它总是在进度结束时从0直接更改为100.I尝试创建一个新线程来调用“setValue(int)” ,而不是调用表单UI线程,但它仍然没有工作。
my code:
public class UpdateProgressBar extends Thread{
public UpdateProgressBar(javax.swing.JProgressBar progressBar){
this.progressBar = progressBar;
}
public void update(){
for(int i = 1; i <= 100; i++){
progressBar.setValue(i);
try {
sleep(10);
} catch (InterruptedException ex) {
Logger.getLogger(UpdateProgressBar.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private javax.swing.JProgressBar progressBar;
}
,progressBar在UI线程中定义,然后我在UI线程中UpdateProgressBar upb = new UpdateProgressBar(progressBar);
并调用它的更新方式upb.update();
我犯了一些错误吗?
答案 0 :(得分:1)
虽然您已声明UpdateProgressBar
扩展Thread
,但您实际上并未将其作为单独的线程运行。您需要调用start()
以使新线程实际运行。如果从事件派发线程调用upb.update()
,那么您正在 on 事件派发线程上执行该方法。
您希望在客户端代码中使用此功能:
UpdateProgressBar upb = new UpdateProgressBar(progressBar);
upb.start();
并将您的UpdateProgressBar
课程更改为:
public class UpdateProgressBar extends Thread{
public UpdateProgressBar(javax.swing.JProgressBar progressBar){
this.progressBar = progressBar;
}
@Override
public void run(){
for(int i = 1; i <= 100; i++) {
final int j = i;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progressBar.setValue(j);
}
});
try {
sleep(10);
} catch (InterruptedException ex) {
Logger.getLogger(UpdateProgressBar.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private javax.swing.JProgressBar progressBar;
}
您需要拥有SwingUtilities.invokeLater
,因为Swing组件不是线程安全的。你还需要讨厌的final int j = i
,因为Java对闭包的处理不那么精彩。将代码放入run
方法意味着在您致电Thread.start()
时会执行该代码。
答案 1 :(得分:0)
也许为它设置的最大值是1?在开始设置值之前设置进度条的最大值,看看会发生什么。