ダイアログ


Swing のダイアログウィンドウ

Swing のダイアログも、ウィンドウやフレーム同様に重量コンポーネントです
これまでと同じで、Swing に適応するためのルートペインなどの拡張が施されています
Swing のダイアログは javax.swing.JDialog クラスで表されます
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--java.awt.Window
                    |
                    +--java.awt.Dialog
                          |
                          +--javax.swing.JDialog

public class JDialog extends Dialog
	implements WindowConstants, Accessible, RootPaneContainer
やはり JComponent を拡張していないので注意してください
コンストラクタは次のようなものが用意されています
public JDialog() throws HeadlessException
public JDialog(Frame owner) throws HeadlessException

public JDialog(
	Frame owner , boolean modal
) throws HeadlessException
public JDialog(
	Frame owner , String title
) throws HeadlessException
public JDialog(
	Frame owner , String title ,
	boolean modal
) throws HeadlessException
public JDialog(
	Frame owner , String title , 
	boolean modal , GraphicsConfiguration gc
)

public JDialog(Dialog owner) throws HeadlessException

public JDialog(
	Dialog owner , boolean modal
) throws HeadlessException
public JDialog(
	Dialog owner , String title
) throws HeadlessException
public JDialog(
	Dialog owner , String title ,
	boolean modal
) throws HeadlessException
public JDialog(
	Dialog owner , String title ,
	boolean modal , GraphicsConfiguration gc
) throws HeadlessException
owner にはオーナーとなるフレーム、またはダイアログを指定します
modal は、モーダルダイアログである場合は true。そうでなければ false を指定します
title はダイアログのタイトルバーに表示される文字列を
gc にはターゲットスクリーンデバイスの GraphicsConfiguration を指定します
ダイアログは、デフォルトでモードレスダイアログボックスなので注意してください

JDialog クラスは重量なので JComponent クラスを継承していません
しかし JDialog.getRootPane()JDialog.getContentPane() メソッドで
デフォルトで設定されているルートペインやコンテンツペインを取得できます
これらを新しく設定するための set_() メソッドも用意されています

protected void setRootPane(JRootPane root)
public void setContentPane(Container contentPane)
public JRootPane getRootPane()
public Container getContentPane()

root にはルートペイン、contentPane にはコンテンツペインを指定します
setRootPane() は公開されていないので、サブクラスからの呼び出しとなります
これらの構造は、基本的に JWindow クラスとほとんど変わりません
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JFrame {
	public static void main(String args[]) {
		JFrame frame = new Test();
		frame.setSize(400 , 200);
		frame.setVisible(true);
	}

	private JDialog dialog;
	public Test() {
		JLabel label = new JLabel(
			"Forget me Not" , new ImageIcon("eario.jpg") ,
			SwingConstants.CENTER
		);
		dialog = new JDialog(this , "Forget-me-Not" , true);
		dialog.getContentPane().add(label);

		JButton button = new JButton("Do you remember me?");
		button.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				dialog.setSize(400 , 200);
				dialog.show();
			}
		});
		
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		addWindowListener(new WindowAdapter() {
			public void windowClosed(WindowEvent e) {
				System.exit(0);
			}
		});
		getContentPane().add(button);
	}
}


このプログラムは、表示したウィンドウに配置されているボタンを押すと
ラベルを保有するモーダルダイアログボックスが表示されます
ダイアログボックスを閉じるまで、フレームをアクティブにすることはできません


標準ダイアログ

ユーザーにメッセージを伝えたり、単純な選択を促すために
多くのシステムが搭載する、標準ダイアログボックスは Swing では使えません
やはり、ピアに依存せずに L&F を保障したダイアログを使うべきです

Swing が提供する標準ダイアログボックスは、ユティリティやクラスでは存在しません
その代わり javax.swing.JOptionPane クラスがダイアログを生成してくれます
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.JOptionPane
public class JOptionPane
	extends JComponent implements Accessible
このクラスには、ダイアログを生成したり表示するための
いくつかの静的メソッドが提供されているので、これを用います
メッセージダイアログは JOptionPane.showMessageDialog() を使います
public static void showMessageDialog(
	Component parentComponent , Object message
) throws HeadlessException
public static void showMessageDialog(
	Component parentComponent , Object message ,
	String title , int messageType
) throws HeadlessException
public static void showMessageDialog(
	Component parentComponent , Object message ,
	String title , int messageType , Icon icon
) throws HeadlessException
parentComponent には、通常は親となる Frame を指定します
message はダイアログに表示するためのメッセージを
title はダイアログのタイトルバーに表示するテキストを指定します

messageType は、このダイアログのメッセージタイプを定数で指定します
JOptionPane はダイアログのタイプを表すための次のフィールド定数を定義しています

定数解説
ERROR_MESSAGE エラーメッセージで使用します
INFORMATION_MESSAGE 情報メッセージで使用します
PLAIN_MESSAGE アイコンは使用しません
QUESTION_MESSAGE 質問で使用します
WARNING_MESSAGE 警告メッセージで使用します

これらのメッセージタイプで、表示される標準アイコンなどが変化します
icon には、ダイアログに表示するアイコンに独自のアイコンを指定します

message パラメータは非常に柔軟に情報を対処してくれます
通常、どのような型を指定しても toString() が返す文字列を利用しますが
Component を渡せばコンポーネントがそのまま表示されますし
Icon を渡せば JLabel が生成され、そのインスタンスに含まれて表示されます
また、配列を渡せばデータ型に応じて順に処理されるなど、機能は多彩です
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		JOptionPane.showMessageDialog(
			this , "Forget me Not" , "Do you remember me?" ,
			JOptionPane.INFORMATION_MESSAGE
		);
	}
}


これが、JOptionPane が生成したモーダルダイアログボックスです
表示されるアイコンは、メッセージタイプによって変化します

ユーザーに、簡単な選択を問いたい場合もあるでしょう
この場合は JOptionPane.showConfirmDialog() を使います
public static int showConfirmDialog(
	Component parentComponent , Object message
) throws HeadlessException
public static int showConfirmDialog(
	Component parentComponent , Object message ,
	String title , int optionType
) throws HeadlessException
public static int showConfirmDialog(
	Component parentComponent , Object message ,
	String title , int optionType , int messageType
) throws HeadlessException
parentComponent には親コンポーネントを、message には表示するメッセージを
title にはダイアログのタイトルバーに表示されるテキストを
optionType にはダイアログで選択可能なオプションを指示する整数を
そして、messageType にはメッセージタイプを指定します
戻り値は、ユーザーが選択したボタンを表すフィールド定数です

optionType は、JOptionPane が提供する次のフィールド定数を指定できます

定数解説
OK_CANCEL_OPTION OK ボタンと CHANCEL ボタンで構成します
YES_NO_CANCEL_OPTION YES、NO、CANCEL ボタンで構成します
YES_NO_OPTION YES、NO ボタンで構成します

質問に適したオプションタイプを指定する必要があります
ユーザーがダイアログのボタンを選択し、制御が返されると
showConfirmDialog() は各ボタンを表すいずれかの定数を返します

定数解説
CANCEL_OPTION 「CANCEL」が選択された場合にクラスメソッドから返される値です
NO_OPTION 「NO」が選択された場合にクラスメソッドから返される値です
OK_OPTION 「OK」が選択された場合にクラスメソッドから返される値です
YES_OPTION 「YES」が選択された場合にクラスメソッドから返される値です

メソッドが返した値を、これらの定数と比較することによって
ユーザーがどのボタンを押したのかを確認することができます
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		String message[] = {
			"日本経済の低迷で国民の不満が高まっています。" ,
			"支持率の低下が懸念されますが、構造改革を断行しますか?"
		};
		int value = JOptionPane.showConfirmDialog(
			this , message ,
			"構造改革!" , JOptionPane.YES_NO_OPTION
		);
		if (value == JOptionPane.YES_OPTION)
			getContentPane().add(new JLabel("構造改革断行!"));
		else getContentPane().add(new JLabel("日本経済、途上国水準に!"));
	}
}


このプログラムは、図のような選択ダイアログボックスを表示します
ユーザーの選択によって、アプレットに表示されるラベルの文字が変化します

ユーザーに文字列などの不定な値を入力させたい場合
JOptionPane.showInputDialog() メソッドを使います
public static String showInputDialog(
	Object message
) throws HeadlessException
public static String showInputDialog(
	Object message , Object initialSelectionValue
)
public static String showInputDialog(
	Component parentComponent , Object message
) throws HeadlessException
public static String showInputDialog(
	Component parentComponent ,
	Object message , Object initialSelectionValue
)
public static String showInputDialog(
	Component parentComponent , Object message ,
	 String title , int messageType
) throws HeadlessException
public static Object showInputDialog(
	Component parentComponent , Object message ,
	String title , int messageType , Icon icon ,
	Object[] selectionValues , Object initialSelectionValue
) throws HeadlessException
parentComponent には、親となるコンポーネントを
message には表示するメッセージ、title はタイトルバーに表示するテキスト
messageType にはメッセージタイプ、icon には表示するアイコンをそれぞれ指定します

selectionValues は、ユーザーが選択可能な項目の配列を指定します
initialSelectionValue には、初期値を指定します
通常の任意入力では String が、選択入力では選択した Object が返ります
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		String name = JOptionPane.showInputDialog(
			this , "名前を入力してください"
		);

		getContentPane().add(new JLabel("ようこそ" + name + "さん"));
	}
}


このプログラムは、テキスト入力フィールドに対する入力を求めます
入力した値は、アプレットに付加するラベルに反映されています

配列を指定することで、任意選択ダイアログボックスを表示することもできます
この場合、ユーザーは与えられている項目の中から選択しなければなりません
使われるコンポーネントは UI に依存しますが、通常はコンボボックスです
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	String names[] = {
		"涼宮 遙" , "速瀬 水月" , "涼宮 茜" ,
		"大空寺 あゆ" , "玉野 まゆ" , "マナマナ"
	};
	public void init() {
		Object name = JOptionPane.showInputDialog(
			this , "名前を選択してください" , "The forever that you wish" ,
			JOptionPane.INFORMATION_MESSAGE , null , names , names[0]
		);

		getContentPane().add(new JLabel("ようこそ" + name + "さん"));
	}
}


このプログラムは、文字列配列を与えることで
配列の中の、いずれかの項目の選択をユーザーに促しています



前のページへ戻る次のページへ