WisdomSoft - for your serial experiences.

5.3 ダイアログ

AWT 及び Swing を用いて、何らかのメッセージや確認を促すためのダイアログを表示します。

5.3.1 ダイアログウィンドウ

ユーザーに何らかの情報を通知したり、ユーザーに何らかのデータを入力させるための専用のウィンドウを、特にダイアログと呼ぶことがあります。ダイアログは通常のアプリケーションウィンドウとよく似ていますが、機能の一部は制限されるでしょう。例えば Windows であれば、ダイアログには最小化と最大化ボタンが存在しません。また、アプリケーションウィンドウと違ってメニュー項目をもつこともありません。

ダイアログには、モードレスダイアログとモーダルダイアログの 2 種類が存在します。モードレスダイアログは通常のウィンドウのように振舞いますが、モーダルダイアログの場合は、ダイアログが破棄させるまで他のウィンドウを操作することができなくなります。

ダイアログは、主にアプリケーションの設定を行う入力用ウィンドウとして使うことができます。モーダルダイアログボックスは、ウィンドウが閉じられるまで、アプリケーションの他のウィンドウを操作することができなくなるため、確実にユーザーに対して情報を伝えたい場合や、ユーザーが入力処理をしている間は、他の処理を実行できなくする手段として利用することができます。

ダイアログにも AWT のダイアログと Swing のダイアログが存在します。まずは、基本となる AWT のダイアログを表示させてみましょう。ダイアログを表示するには java.awt.Dialog クラスのインスタンスを用います。

java.awt.Dialog クラス
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--java.awt.Window
                    |
                    +--java.awt.Dialog
public class Dialog extends Window

Dialog クラスは Frame クラス同様に、Window クラスから派生しているサブクラスです。ダイアログの終了処理や破棄は WindowListener で行わなければなりません。

ダイアログも、Frame クラス同様に、システムに依存したタイトルバーや終了ボタンなどの GUI 部品を備えています。タイトルバーに表示する文字は、コンストラクタや setTitle() メソッドなどから指定することができます。

表1 Dialog クラスのコンストラクタとメソッド(抜粋)
コンストラクタ 解説
public Dialog(Dialog owner) 指定されたダイアログを持つ、最初は表示されないモードレスダイアログを構築する。
public Dialog(Dialog owner, String title) 指定されたダイアログおよびタイトルを持つ、最初は表示されないモードレスダイアログを構築する。
public Dialog(Dialog owner, String title, boolean modal) 指定されたダイアログおよびタイトルを持つ、モーダルであるかどうかを指定された、最初は表示されないダイアログを構築する。
public Dialog(Frame owner) 指定されたフレームを持つ、最初は表示されないモードレスダイアログを構築します。
public Dialog(Frame owner, boolean modal) 指定されたフレームを持つ、モーダルであるかどうかを指定された、最初は表示されないダイアログを構築する。
public Dialog(Frame owner, String title) 指定されたフレームおよびタイトルを持つ、最初は表示されないモードレスダイアログを構築する。
public Dialog(Frame owner, String title, boolean modal) 指定されたフレームおよびタイトルを持つ、モーダルであるかどうかを指定された、最初は表示されないダイアログを構築する。
メソッド
public void setTitle(String title) ダイアログのタイトルを設定する。
public String getTitle() ダイアログのタイトルを返す。
public void setModal(boolean b) ダイアログがモーダルかどうかを指定する。
public boolean isModal() ダイアログがモーダルであるかどうかを返す。

Dialog() コンストラクタでは、表示するダイアログの親を設定します。表示されているダイアログの親ウィンドウが非表示になった場合や最小化された場合、そのダイアログは自動的にユーザに対して表示されなくなります。

また、コンストラクタや setModal() メソッドでダイアログをモーダルダイアログとして設定した場合、show() メソッドを使って表示すると、ダイアログは制御を返さずにユーザーの入力を待機します。show() メソッドは制御を返さないので、ダイアログが終了するまで、他のウィンドウを操作することができなくなります。表示されているモーダルダイアログが、ユーザーの入力などによって終了し dispose() メソッドが呼び出されると show() メソッドはダイアログの破棄と同次に制御を返します。

コード1
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JFrame {
	public static void main(String args[]) {
		JFrame win = new Test();
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.show();
	}

	public Test() {
		addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				Dialog dlg = new Dialog(
					(Frame)e.getComponent() ,
					"Kitty on your lap" , true
				);
				dlg.addWindowListener(new WindowAdapter() {
					public void windowClosing(WindowEvent e) {
						e.getWindow().dispose();
					}
				});

				dlg.setBounds(10 , 10 , 200 , 100);
				dlg.show();
			}
		});
	}
}
実行結果
コード1 実行結果

コード1は、アプリケーションウィンドウの作業領域をクリックすると、ダイアログウィンドウを表示させるというものです。このダイアログはモーダルダイアログとして設定されているため、show() メソッドを呼び出すと、ダイアログウィンドウが破棄されるまで、show() メソッドの呼び出し元に制御を返さないという特徴があります。そのため、ダイアログが表示されている間は、アプリケーションウィンドウを操作することができなくなるでしょう。終了ボタンを押してダイアログを破棄すれば、show() メソッドから制御が帰ります。

このプログラムの Dialog() コンストラクタを書き換えて、モードレスダイアログとして表示すれば、通常のウィンドウのように生成されたダイアログは自立します。モードレスダイアログは、show() メソッドを呼び出しても制御を返すので、アプリケーションウィンドウは継続して入力可能状態となります。そうすると、アプリケーションウィンドウでマウスイベントを連続して発生させれば、ダイアログウィンドウが繰り返し生成されてしまいます。もし、アプリケーションの設定用ダイアログが同時に複数も表示されては、データの整合性に問題が生じる可能性があります。こうした問題をスマートに解決するために、他のウィンドウを操作不能にするモーダルダイアログが使われるのです。

5.3.2 Swing のダイアログ

Swing のダイアログは、JApplet や JFrame クラス同様に、Dialog クラスに Swing アーキテクチャのルールを採用した javax.swing.JDialog クラスを用います。JDialog クラスでは、Dialog クラスの機能に加えて終了ボタンが押されたときの動作を設定することができます。この点は JFrame と同じです。

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

Dialog クラスは、インスタンスを生成するとき、コンストラクタで必ずダイアログの所有者となるウィンドウを指定しなければなりませんでした。基本的には JDialog も親ウィンドウを指定しますが、JWindow クラスのように引数の無いコンストラクタ、または null のウィンドウを指定することができます。この場合は、JWindow と同じように見えない共通フレームを生成して、これを親ウィンドウと仮定します。

表2 JDialog クラスのコンストラクタとメソッド(抜粋)
コンストラクタ 解説
public JDialog() throws HeadlessException モーダルでないダイアログを、タイトルおよび Frame 所有者なしで生成する。
public JDialog(Frame owner) throws HeadlessException モーダルでないダイアログを、タイトルなしで、指定された Frame を所有者として生成する。
public JDialog(Frame owner, boolean modal) throws HeadlessException モーダルまたはモーダルでないダイアログを、タイトルなしで、指定された所有者 Frame で生成する。
public JDialog(Frame owner, String title) throws HeadlessException モーダルでないダイアログを、指定されたタイトルで、指定された所有者フレームで生成する。
public JDialog(Frame owner, String title, boolean modal) throws HeadlessException モーダルまたはモーダルでないダイアログを、指定されたタイトルと所有者 Frame で生成する。
public JDialog(Dialog owner) throws HeadlessException モーダルでないダイアログを、タイトルなしで、指定された Dialog を所有者として生成する。
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 void setDefaultCloseOperation(int operation) ユーザがこのダイアログを閉じようとしたときに実行される処理を設定する。
public int getDefaultCloseOperation() ユーザがこのダイアログを閉じようとしたときに実行される処理を返す。

表2は、JDialog クラスの主なコンストラクタとメソッドを表しています。JDialog には WindowConstants インタフェースが実装されていることに注目してください。JDialog は JFrame クラスと同じく終了ボタンがあるので setDefaultCloseOperation() メソッドで、デフォルトの終了動作を指定するなどの機能が追加されています。

コード2
import javax.swing.*;
import java.awt.*;

public class Test {
	public static void main(String args[]) {
		JFrame win = new JFrame("JFrame ウィンドウ");
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.show();

		JDialog dlg = new JDialog(win , "JDialog ウィンドウ" , true);
		dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		dlg.setBounds(50 , 100 , 300 , 100);
		dlg.show();
	}
}
実行結果
コード2 実行結果

コード2は JFrame インスタンスを生成し、このオブジェクトを JDialog() コンストラクタに渡しています。JDialog() コンストラクタでは、モーダルダイアログであることを指定しているため、このダイアログの show() メソッドを呼び出すと、ダイアログが閉じられるまでメソッドは制御を返しません。