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やってて、お仕事でもこの説明に苦労しています。
この辺の話はややこしくわかりにくいです。