S-JIS[2009-11-03/2009-11-08] 変更履歴

ProgressDialog

ひしだま作のプログレスバーを表示して処理を行うダイアログです。→ソース

ProgressDialogを継承したダイアログクラスを作って実行することで、プログレスバー (JProgressBar)を表示しつつ処理を行うことが出来ます。

Java Swing標準でProgressMonitorという進捗ダイアログがあるので、単純な事ならそちらの方が楽かもしれません。[2009-11-08]


使用例

ProgressDialogを継承したクラスの例:

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ボタンは最初は押せない。
   
実行完了  

ProgressDialogのメソッド

  メソッド オーバー
ライド可否
説明
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を指定すると、ダイアログを表示し、スレッド処理を開始する。
(モーダルダイアログでもモードレスダイアログでも動作する→両者の違い

自作Swingライブラリーへ戻る / 自作ソフトへ戻る / 技術メモへ行く
メールの送信先:ひしだま