java更新进度条

时间:2011-06-06 17:20:28

标签: java swing

我有一个JFrame和以下组件。

JButton = jButton1 进度条= progressBar及其公共静态 JLabel =状态及其公共静态

当按钮单击时,执行不同的语句。我希望在每个语句后更新我的进度条。这是我的代码

   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        Task pbu = new Task(25, "Step 1....");
        pbu.execute();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        pbu = new Task(50, "Step 2....");
        pbu.execute();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        pbu = new Task(75, "Step 3....");
        pbu.execute();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        pbu = new Task(100, "Done");
        pbu.execute();
    }

这是我使用SwingWorker扩展的任务类

public class Task extends SwingWorker{

    private int progress;
    private String stat;

    public Task(int pr, String st) {
        progress = pr;
        stat = st;
    }

    @Override
    protected Object doInBackground() throws Exception {
        NewJFrame1.progressBar.setValue(progress);
        NewJFrame1.status.setValue(stat);
        return null;
    }

}

知道如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

   @Override
    protected Object doInBackground() throws Exception {
        NewJFrame1.progressBar.setValue(progress);
        NewJFrame1.status.setValue(stat);
        return null;
    }

您不希望从Swing线程更新GUI组件。 SwingWorker提供了在事件调度线程上执行操作的挂钩,这就是它的设计目的。从publish调用doInBackground方法并覆盖process以详细说明增量更新。或者,如果您只需要在完成后更新GUI,请覆盖done()方法。

一个非常简单的例子:

//...in some concrete implementation of SwingWorker<Void, Integer>
protected Void doInBackground() throws Exception {
    //do 10% of task
    doLongOp();
    publish(10);

    //do another 20% of task
    doAnotherLongOp();
    publish(20);

    return null;
}

protected void process(List<Integer> pieces) {
    for (Integer percent : pieces ) {
       progressBar.setValue(progressBar.getValue() + percent);
    }
}

修改

@mKorbel提出了一个很好的观点,为了使上述工作,它需要扩展SwingWorker<Void, Integer> ... Void作为整体返回值类型(在这种情况下表示没有返回值)和{ {1}}是增量更新的类型。

如果工作人员产生实际的最终结果(将使用Integer检索),则可以使用该类型代替get()。因为我没有包括课堂声明,所以我遗漏了这些细节。

答案 1 :(得分:2)

除了Mark的答案,你真的不想睡在actionPerformed()方法中。这个方法是(如果链接到GUI组件)由AWT / Swing事件调度线程调用,同样的线程也绘制和一切。只要您的方法没有完成,您的GUI就会被阻止。

在SwingWorker或其他线程中等待所有等待。