进度条更新问题,直接从0更改为100,Java中没有1,2,3 ......

时间:2011-12-28 05:26:45

标签: multithreading user-interface progress-bar

我想更改进度条使用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();我犯了一些错误吗?

2 个答案:

答案 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?在开始设置值之前设置进度条的最大值,看看会发生什么。