【问题标题】:progress bar update issue,directly change from 0 to 100,there's not 1,2,3...... in Java进度条更新问题,直接从0变为100,Java中没有1,2,3……
【发布时间】:2011-12-28 05:26:44
【问题描述】:

我想用SetValue(int)来改变一个进度条,但是它不起作用,它总是在进度完成时直接从0变为100。我尝试创建一个新线程来调用“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();我是不是搞错了?

【问题讨论】:

    标签: multithreading user-interface progress-bar


    【解决方案1】:

    虽然您已声明 UpdateProgressBar 以扩展 Thread,但您实际上并未将其作为单独的线程运行。您需要调用start() 以使新线程实际运行。如果您从事件调度线程调用upb.update(),那么您正在执行该方法事件调度线程。

    您希望在您的客户端代码中使用它:

    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()时被执行。

    【讨论】:

      【解决方案2】:

      也许为它设置的最大值是 1?在开始设置值之前设置进度条的最大值,看看会发生什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        相关资源
        最近更新 更多