S-JIS[2009-11-03/2009-11-08] 変更履歴
ひしだま作のプログレスバーを表示して処理を行うダイアログです。→ソース
ProgressDialogを継承したダイアログクラスを作って実行することで、プログレスバー (JProgressBar)を表示しつつ処理を行うことが出来ます。
(Java Swing標準でProgressMonitorという進捗ダイアログがあるので、単純な事ならそちらの方が楽かもしれません。[2009-11-08])
import javax.swing.JProgressBar; import jp.hishidama.swing.dialog.ProgressDialog;
@SuppressWarnings("serial") public class MyProgressDialog extends ProgressDialog { protected List<Integer> list; protected JLabel nowId = new JLabel("-"); public MyProgressDialog(Frame owner, boolean modal) { super(owner, modal); } public void init(List<Integer> list) { this.list = list; setTitle("ProgressDialogのサンプル"); super.init(); setAutoClose(false); } @Override protected JProgressBar createProgressBar() { return new JProgressBar(0, list.size()); } @Override protected void initCenterPane(Container c) { JPanel panel = new JPanel(); BoxLayout layout = new BoxLayout(panel, BoxLayout.PAGE_AXIS); panel.setLayout(layout); panel.add(new JLabel("プログレスダイアログのサンプル")); panel.add(nowId); c.add(panel, BorderLayout.CENTER); }
// スレッドで行う処理を記述する @Override public void run() { for (int i = 0; i < list.size(); i++) { if (canceled()) { return; } Integer id = list.get(i); nowId.setText(id.toString()); //処理する番号を表示 // idを使って何かの処理を行う setProgressValue(i + 1); //処理が終わったので進捗具合を更新 } // 処理が終わったら、progressEnd()を呼ぶ progressEnd(); } }
public static void main(String[] args) { //サンプルデータ作成 int size = 10000; List<Integer> list = new ArrayList<Integer>(size); for (int i = 0; i < size; i++) { list.add(i); } // プログレスダイアログの表示・実行 MyProgressDialog dialog = new MyProgressDialog(null, true); dialog.init(list); dialog.setVisible(true); }
実行中 | ![]() |
デフォルトでOKボタンとCANCELボタンが付く。 OKボタンは最初は押せない。 |
↓ | ||
実行完了 | ![]() |
メソッド | オーバー ライド可否 |
説明 | |
---|---|---|---|
public | ProgressDialog(owner, modal) | modalがtrueの場合はモーダルダイアログ modalがfalseの場合はモードレスダイアログ |
|
public | init() | ○ | コンストラクターでのインスタンス生成後に呼び出す。 この中でダイアログの各種初期化を行う。 デフォルトでは、ダイアログの位置やサイズ等の初期化を行い、 initProgressPane()・initCenterPane()・initButtonPane()を呼び出す。 |
public | setAutoClose(b) | - | trueを指定すると、処理が終了したら自動的にダイアログを閉じる。 デフォルトはfalse。 |
protected | initProgressPane() | ○ | プログレスバーの初期化を行う。 デフォルトではBorderLayoutの上部(PAGE_START)にプログレスバーを配置する。 プログレスバー生成の為にcreateProgressBar()を呼び出す。 |
protected | initCenterPane() | ○ | BorderLayoutの中央(CENTER)に各種コンポーネントを配置する想定。 デフォルトでは無処理。 |
protected | initButtonPane() | ○ | ボタンの初期化を行う。 デフォルトではBorderLayoutの下部(PAGE_END)にOKボタンとCANCELボタンを配置する。 ボタン生成の為にcreateOkButton()・createCancelButton()を呼び出す。 |
protected | createProgressBar() | ◎ | プログレスバーインスタンスを生成する。 デフォルトではnew JProgressBar()を返す。 最大値をセットする為には、当メソッドをオーバーライドする。 |
public | run() | ◎ | 実際の処理を記述する。当メソッドはスレッドを生成して呼ばれる。 処理が全て完了したら、progressEnd()を呼ばなければならない。 |
public | canceled() | - | ダイアログが終了している場合、trueを返す。 CANCELボタンが押された後もtrueになる。 |
public | setProgressValue(n) | - | プログレスバーの現在値をセットする為に当メソッドを呼ぶ。 |
public | progressEnd() | - | 処理が終了したら当メソッドを呼ぶ。 デフォルトではCANCELボタンを使用不可にし、OKボタンを使用可能にする。 また、autoCloseがtrueになっている場合はダイアログを終了する。 |
public | setVisible(b) | - | trueを指定すると、ダイアログを表示し、スレッド処理を開始する。 (モーダルダイアログでもモードレスダイアログでも動作する→両者の違い) |