JProgressBar

重い処理を実行させる場合、プログレスバーを使うことがありますが、
重い処理は当然別スレッドにする必要があります。
その中でプログレスバーの進捗を進めればOKです。
ただし、直接呼ぶのはお勧めできません。
まぁ、ほとんどの場合、何も問題なく動くでしょうが、
厳密にはSwingUtilities.invokeLater()を使って、イベントディスパッチスレッドで
プログレスバーを変更すべきです。

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

public class HeavyAction extends JFrame {
    JProgressBar progressBar = new JProgressBar(0, 100);
    JButton button = new JButton("開始");
    HeavyAction() {
        super("重いアクション");
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(progressBar, BorderLayout.SOUTH);
        getContentPane().add(button, BorderLayout.CENTER);

        progressBar.setStringPainted(true);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new HeavyThread().start();
            }
        });
        setSize(640, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    class HeavyThread extends Thread {
        public void run() {
            for (int i=0; i<100; i++) {
                try { Thread.sleep(100L); } catch (InterruptedException e) {}
                final int pos = i+1;
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        progressBar.setString(pos+"/100"); 
                        progressBar.setValue(pos);
                    }
                });
            }
        }
    }
    public static void main(final String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new HeavyAction().setVisible(true);
            }
        });
    }
}

うーむ、最近Swingやってて、お仕事でもこの説明に苦労しています。
この辺の話はややこしくわかりにくいです。