S-JIS[2007-02-04/2009-04-06] 変更履歴

JOptionPane(Swing)

JOptionPaneは、メッセージボックスやインプットボックスを表示するクラス。


単純なメッセージ出力

	public void MessageBox() {
		//●最も単純なメッセージ出力
		JOptionPane.showMessageDialog(null, "メッセージ本文");

		//●タイトルを付けたメッセージ出力
		JOptionPane.showMessageDialog(null, "本文", "タイトル",
			JOptionPane.INFORMATION_MESSAGE);
	}

独自のアイコンを指定する例 [2007-02-10]

メッセージには、\nで改行を指定できる。[2009-03-16]
また、<html>〜</html>タグで囲むことにより、HTMLを指定することも出来る。(JLabelと同様)

さらに、String以外にComponent(JLabel等)やIconを指定することも出来る。
その他のオブジェクトも指定できるが、その場合はtoString()したものが表示される。


メッセージを表示して、ボタン入力

	public void MessageBox() {

		//●はい・いいえ・取消し
		int rc = JOptionPane.showConfirmDialog(null, "メッセージ本文");
		switch (rc) {
		case JOptionPane.OK_OPTION:
		// case JOptionPane.YES_OPTION:
			System.out.println(rc + " OK");break;
		case JOptionPane.NO_OPTION:
			System.out.println(rc + " NO");break;
		case JOptionPane.CANCEL_OPTION:
			System.out.println(rc + " CANCEL");break;
		case JOptionPane.CLOSED_OPTION:
			System.out.println(rc + " ×ボタン");break;
		default:
			System.out.println(rc + " 未定義");break;
		}

		//●了解・取消し
		rc = JOptionPane.showConfirmDialog(null, "本文", "タイトル",
			JOptionPane.OK_CANCEL_OPTION);
		System.out.println(rc);

		//アイコンも指定してみる
		rc = JOptionPane.showConfirmDialog(null, "本文", "タイトル",
			JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
	}

ボタンのカスタマイズ

	public void showMessageBox() {
		String[] button = { "ボタン1", "ボタン2", "ボタン3" };

		int rc = JOptionPane.showOptionDialog(null, "message", "title",
			JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
			null,
			button,
			button[0]);
		switch (rc) {
		case JOptionPane.CLOSED_OPTION:
			System.out.println(rc + " close");break;
		default:
			System.out.println("ボタン" + (rc + 1));break;
		}
	}

文字列入力

	public void InputBox() {
		String ret = JOptionPane.showInputDialog(null, "メッセージ");
		if (ret == null) {
			System.out.println("cancel or close");
		} else {
			System.out.println(ret);
		}

		//●テキストボックスに初期値を指定
		ret = JOptionPane.showInputDialog(null, "メッセージ", "初期テキスト");
		System.out.println(ret);

		//●タイトルとアイコンを指定
		ret = JOptionPane.showInputDialog(null, "メッセージ", "タイトル", JOptionPane.PLAIN_MESSAGE);
	}

メソッド 概要 備考
showMessageDialog メッセージを表示     showMessageDialog
メッセージタイプ
(ダイアログに表示されるアイコンの種類を指定)
PLAIN_MESSAGE アイコン無し
独自アイコンを使う場合もこれ
INFORMATION_MESSAGE 情報(i)
WARNING_MESSAGE 警告(!)
ERROR_MESSAGE エラー(×)
QUESTION_MESSAGE クエスチョン(?)
showConfirmDialog 確認を求めるダイアログを表示     showConfirmDialog
オプションタイプ
(ダイアログに表示されるボタンの種類を指定)
DEFAULT_OPTION 「了解」
YES_NO_OPTION 「はい」「いいえ」
YES_NO_CANCEL_OPTION 「はい」「いいえ」「取消し」
OK_CANCEL_OPTION 「了解」「取消し」
戻り値 OK_OPTION
YES_OPTION
了解
はい(値は同じ)
NO_OPTION いいえ
CANCEL_OPTION 取り消し
CLOSED_OPTION ダイアログが閉じられた
showOptionDialog 確認を求めるダイアログを表示
(ボタンをカスタマイズできる)
    showOptionDialog
オプション
(“ボタンに表示する文字列”の配列を指定)
  Object型だから、アイコンも可能かも?
初期値
(最初にフォーカスが当たるボタンを指定)
  オプションの中の1つを指定
showInputDialog 文字列を入力するダイアログを表示   入力された文字列が返る
キャンセルされた場合はnull
showInputDialog

ウィンドウアプリ以外で使う場合の注意

上記のメソッドはstaticメソッドなので、Swingを使ったウィンドウアプリ以外でも(例えばmain()関数から)直接呼び出してメッセージボックスを表示することが出来る。
ただしJDK1.4では、見えないウィンドウ(AWTのスレッド)が残ってしまうせいか、main()が終了してもアプリケーション自体は終了しない。
明示的にSystem.exit()を呼んで終わらせてやる必要がある。
JDK1.5以降ではそういう事をしなくてもちゃんと終了する。[2007-10-24]


独自のダイアログ

もっと複雑な内容のダイアログを表示するには、JDialogを使う。[2009-04-06]
(実際のところ、showMessageDialog()showConfirmDialog()等でも、内部ではJDialogを作ってそれを表示している)

しかしながら、showMessageDialog()やshowConfirmDialog()では、messageにJPanel等のコンポーネントを指定することが出来る。
これを使うとOKやCANCELといったボタンがそのまま扱えるので、素のJDialogを使うよりも便利。

	public static void showMyDialog() {

		JPanel panel = new JPanel();
		BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS);
		panel.setLayout(layout);

		panel.add(new JLabel("2つのテキスト入力エリアがある例"));
		JTextField text1 = new JTextField();
		panel.add(text1);
		JTextField text2 = new JTextField();
		panel.add(text2);

		int r = JOptionPane.showConfirmDialog(
			null,				// オーナーウィンドウ
			panel,				// メッセージ
			"タイトル",			// ウィンドウタイトル
			JOptionPane.OK_CANCEL_OPTION,	// オプション(ボタンの種類)
			JOptionPane.QUESTION_MESSAGE);	// メッセージタイプ(アイコンの種類)

		System.out.println(r);
		System.out.println(text1.getText());
		System.out.println(text2.getText());
	}

上記のダイアログの戻り値はOK_OPTION(0)やCANCEL_OPTION(2)や×ボタン(-1)。
どのボタンで終了しても、ダイアログで入力していたtext1やtext2の値は取得できる。

しかしこのやり方だと、デフォルトのフォーカスが当たるのは先頭のボタンになる(独自JPanel上のコンポーネントでなく)。
showConfirmDialog()達はstaticメソッドなので、オーバーライドして独自処理を行うことは出来ない…。


という訳で、JOptionPaneを直接コンストラクターから生成すればメソッドをオーバーライドできるようになる。[2009-04-06]
ボタンにフォーカスを与えているのはデフォルトのselectInitialValue()メソッドなので、これを呼ばないようにする。
このメソッドの中で特にフォーカスの設定を行わなければ、普通に左上にある入力可能コンポーネントにフォーカスが当たる。

static void showConstructorDialog() {

		JPanel panel = new JPanel();
		〜 パネルの初期化:同上 〜

		JOptionPane pane = new JOptionPane(
			panel,				// メッセージ
			JOptionPane.QUESTION_MESSAGE,	// メッセージタイプ(アイコンの種類)
			JOptionPane.OK_CANCEL_OPTION	// オプション(ボタンの種類)
		) {
			private static final long serialVersionUID = 1L;

			@Override
			public void selectInitialValue() {
//				super.selectInitialValue(); //ボタンにフォーカスを当てる
			}
		};
		JDialog dialog = pane.createDialog(
			null,				// オーナーウィンドウ
			"タイトル");			// ウィンドウタイトル
		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		dialog.setVisible(true);

		Object r = pane.getValue();
		System.out.println(r);
		System.out.println(text1.getText());
		System.out.println(text2.getText());
	}

ダイアログの戻り値(どのボタンによって終了したか)はJOptionPane#getValue()で分かる。
ウィンドウの右上の×ボタンで終了した場合はnull。
OKボタンの場合はOK_OPTION(0)、キャンセルボタンならCANCEL_OPTION(2)となる。ただし型はInteger

どのボタンによって終了しても、ダイアログで入力していたtext1やtext2の値は取得できる。

※このやり方の場合、このダイアログを表示するのみのプログラムでは、ダイアログを閉じてもプログラム終了とはならない(JDK1.6でも)。


Swing目次へ戻る / Java目次へ戻る / 新機能へ戻る
メールの送信先:ひしだま