ダイアログ


モーダルとモードレス

GUIアプリケーションで、ちょっとした注意や警告をユーザーに促したり
注目してほしいないように目を向けさせたりするのがダイアログボックスです

ダイアログは、バージョンのようなウィンドウを新しく生成するほど
さほど大掛かりにはしたくない、する必要のない作業に効力を発揮します

Java言語のダイアログの概念は、Windowオブジェクトです
ダイアログを生成するのに使うのがjava.awt.Dialogクラスであり
このクラスはWindowクラスを継承しています。コンストラクタは次のものがあります

public Dialog( Frame parent )
public Dialog( Frame parent, boolean modal )
public Dialog( Frame parent, String title )
public Dialog( Frame parent, String title, boolean modal )

parentには、ダイアログのオーナー(所有者)となるFrameオブジェクトを指定します
一般的には、呼び出し元となったFrameやコンテナをキャストするなどします

titleには、ダイアログのフレーム部分に表示されるタイトルを指定します
modalでは、親ウィンドウやスレッドのブロックをするかどうかを指示します
デフォルトでは、親ウィンドウへの入力(アクティブ化)は可能で、スレッドも動いています

生成されたダイアログウィンドウは非表示です
setVisible(true)として、画面に表示させることができます
import java.awt.*;
import java.awt.event.*;

class test extends WindowAdapter {
        public static void main(String args[]) {
                new test().start();
        }
        private void start() {
                Dialog alert = new Dialog(new Frame() , "Kitty on your lap");
                alert.add(new Label("Kitty on your lap"));

                alert.setSize(300 , 150);
                alert.setVisible(true);

                alert.addWindowListener(this);
        }
        public void windowClosing(WindowEvent e) {
                System.exit(0);
        }
}
このアプリケーションを実行すると、ダイアログだけが出てきます
このように、ダイアログベースのアプリケーションを作成することもできます

ダイアログベースの場合、アイコン化できないことや
メニューバーを設置することができないということを忘れないでください

ダイアログベースのウィンドウの設置として、設定の変更や
警告ダイアログ、アプリケーションへの入力の禁止などを目的とする傾向が強いでしょう
しかし、上のプログラムの場合は親ウィンドウを(ないが…)アクティブにもできますし
スレッドは動きつづけています。これをモードレスと言います

そこで、ダイアログが表示されている間
いっさいの作業を中止する必要がある場合はモーダルダイアログに指定します
モーダルダイアログは、Dialog()コンストラクタのboolean型の引数でtrueに指定します

さらに、設定や警告ダイアログではサイズを変更されると不都合です
サイズ変更の可不可はDialogクラスのsetResizable()メソッドで設定できます

public synchronized void setResizable( boolean resizable )

resizableで、変更可能な場合はtrue。
変更を許さない場合はfalseを指定します
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/*	<applet code="App42.class" width="300"height="300">
 	</applet>
*/

public class App42 extends Applet implements ActionListener {
	Dialog dia;
	Frame frm;
	public void init() {
		setLayout(new GridLayout(1,1));
		Button but = (Button)add(new Button("frame"));
		but.addActionListener(this);
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand() == "frame") {
			if (frm == null) {
				frm = new Frame("Kitty on your lap");
				Button fb = (Button)frm.add(new Button("Kitty on your lap"));
				fb.addActionListener(this);
				frm.setSize(200 , 200);
				frm.setVisible(true);
			}
			else if (dia == null) {
				frm.dispose();
				frm = null;
			}
			return;
		}
		if (e.getActionCommand() == "OK") {
			dia.dispose();
			dia = null;
			return;
		}
		
		dia = new Dialog(frm, "Kitty" , true);
		dia.setLayout(new GridLayout(2 , 1));
		dia.setResizable(false);
		dia.add(new Label("Kitty on your lap"));

		Button but = (Button)dia.add(new Button("OK"));
		but.addActionListener(this);

		dia.setSize(400 , 200);
		dia.setVisible(true);
	}
}
アプレット

ボタンを押すと、まず親となるフレームが出現します
親フレームのボタンを押すと、ダイアログが出てきますので確認してください
ダイアログが出ている間は親フレームは操作できません

それと、フレームを消すときはダイアログが出ていない状態で
上のfraneボタンをもう一度押して消してください
(終了ボタンのイベントを作っていないので…)



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