Javaには Dialog クラスが用意されていて、このクラスを継承することでダイアログボックスを簡単に表示することができます。
ダイアログボックスは「確認」の他にも、「メッセージの表示」や「データの入力」などにも使えるのでとても便利です。基本的な使い方を今回で習得しましょう。
【1】sample206 フォルダをフォルダごとコピーして、sample207 フォルダを作ります。

【2】今回は以下のようなファイル構成になりますので、コピーした余計なものは削除してください。

*SampleDb030.class を忘れないようにしてください。
【3】PrefTest.java を以下のように変更します。
*「\」はWindowsではエンマークのことです。
保存先 C:\java\sample207
ファイル名 PrefTest.java
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
class PrefFrame extends Frame implements ActionListener {
Label lb1;
TextArea txtar1;
Button btn1, btn2, btn3;
ExitDialog dlog;
public PrefFrame(String title) {
//フレームのタイトル
setTitle(title);
//ウィンドウを閉じる時
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dlog.setVisible(true);
}
});
//ラベル
lb1 = new Label("ボタンをクリックしてください。", Label.CENTER);
lb1.setFont(new Font("Serif", Font.BOLD, 12));
lb1.setForeground(Color.blue);
add(lb1, BorderLayout.NORTH);
//テキストエリア
txtar1 = new TextArea();
txtar1.setFont(new Font("Dialog", Font.PLAIN, 14));
txtar1.setForeground(new Color(64, 64, 64));
add(txtar1, BorderLayout.CENTER);
//パネル
Panel pn1 = new Panel();
pn1.setLayout(new GridLayout(1, 3));
//ボタンの設定
btn1 = new Button("表示");
btn2 = new Button("クリア");
btn3 = new Button("終了");
btn3.setForeground(new Color(255, 0, 0));
btn1.addActionListener(this);
btn2.addActionListener(this);
btn3.addActionListener(this);
pn1.add(btn1);
pn1.add(btn2);
pn1.add(btn3);
//パネルを追加
add(pn1, BorderLayout.SOUTH);
//ダイアログボックス生成
dlog = new ExitDialog(this, "プログラムを終了しますか?");
}
public void actionPerformed (ActionEvent e) {
if (e.getSource() == btn1) {
prefDisplay();
lb1.setText("表示しました。");
}else if (e.getSource() == btn2) {
txtar1.setText("");
lb1.setText("クリアしました。");
}else {
dlog.setVisible(true);
}
}
private void prefDisplay () {
try {
//データベースに接続
Connection con = SampleDb030.getConnection();
//ステートメントオブジェクトを作成
Statement stmt = con.createStatement();
//SQL文作成
String mySql = "select * from T01Prefecture order by PREF_CD";
//検索するSQL実行
ResultSet rs = stmt.executeQuery(mySql);
StringBuffer temp = new StringBuffer();
//結果セットからデータを取り出す next()で次の行に移動
while(rs.next()) {
int prefCd = rs.getInt("PREF_CD");
String prefName = rs.getString("PREF_NAME");
temp.append(prefCd + "\t");
temp.append(prefName + "\n");
}
txtar1.setText(temp.toString());
//オブジェクトを解放
rs.close();
stmt.close();
con.close();
} catch (Exception e) {
System.out.println("例外発生:" + e );
}
}
}
class ExitDialog extends Dialog implements ActionListener {
public ExitDialog(Frame parent, String title) {
//スーパークラスのコンストラクタを呼び出す
super(parent, title);
//ダイアログボックスを閉じる時
addWindowListener( new WindowAdapter () {
public void windowClosing(WindowEvent e) {
setVisible(false);
}
});
//ダイアログボックスの設定
setLocation(320, 300);
setSize(220, 80);
setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
setBackground(Color.LIGHT_GRAY);
//ボタンの設定
Button btnYes = new Button("はい");
Button btnNo = new Button("いいえ");
Font f = new Font ("Dialog", Font.PLAIN, 14);
btnYes.setFont (f);
btnNo.setFont (f);
btnYes.setForeground(new Color(255, 0, 0));
btnYes.addActionListener(this);
btnNo.addActionListener(this);
add(btnYes);
add(btnNo);
}
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
if( str.equals("はい") ) {
System.exit(0);
} else if( str.equals("いいえ") ) {
setVisible(false);
}
}
}
public class PrefTest {
public static void main(String args[]) {
PrefFrame frm = new PrefFrame("都道府県マスター");
//フレームの設定
frm.setLocation(300, 200);
frm.setSize(250, 350);
frm.setBackground(Color.LIGHT_GRAY);
frm.setVisible(true);
}
}
【4】コマンドプロンプトを起動して、カレントディレクトリを sample207 に切り替えます。

【5】javac PrefTest.java と入力し、コンパイルします。

【6】java PrefTest と入力し、プログラムを実行します。

【7】ウィンドウが表示されました。

【8】「表示」ボタンをクリックします。

【9】データが表示され、ラベルにメッセージが表示されました。

【10】「クリア」ボタンをクリックします。

【11】データがクリアされ、ラベルのメッセージが変わりました。

【12】「終了」ボタンをクリックします。

【13】確認のダイアログボックスが表示されました。

【14】まず「いいえ」ボタンをクリックします。

【15】ダイアログボックスが消え、何も起こりません。

【16】もう一度「終了」ボタンをクリックしてダイアログボックスを表示させ、今度は「はい」ボタンをクリックします。

【17】システムが終了して、コマンドプロンプトが入力待ちの状態になりました。

ウィンドウの閉じるボタンをクリックしても、確認のダイアログボックスが表示されますので試してください。

ダイアログボックスの閉じるボタンをクリックしたら、「いいえ」をクリックした場合と同じで、何も起こりません。

【解説】
ダイアログボックスは、Dialog クラスを継承したクラスで作ります。使い方はほとんど Frame クラスと同じです。ただダイアログボックスの場合は単独では存在できず、必ず親コンポーネントが必要です。親コンポーネントとはウィンドウや他のダイアログボックスのことです。
■PrefFrameクラス側
(1)オリジナルのダイアログボックスクラスの変数を宣言しています。
ExitDialog dlog;
(2)ダイアログボックスを生成している部分です。コンストラクタの1番目の引数に、親コンポーネントとして this を指定しています。 this はウィンドウ自身です。2番目の引数はダイアログボックスのタイトルになります。
dlog = new ExitDialog(this, "プログラムを終了しますか?");
*この段階ではダイアログボックスはまだ非表示です。
(3)これまでシステムを終了していた部分を、ダイアログボックスを表示する命令に変更します。dlogはダイアログボックスを指している参照型変数ですので、この変数を使いダイアログボックスのメソッドにアクセスしています。
System.exit(0); → dlog.setVisible(true);
(4)ボタンをクリックしたときに、actionPerformed ()メソッドで、ラベルのテキストを変更しています。
lb1.setText("表示しました。");
lb1.setText("クリアしました。");
(5)ボタンの生成、イベントリスナー登録、パネルへの追加を種類ごとにまとめました。種類ごとにまとめることで、後々は配列を使い同じような処理をまとめることができます。
btn1 = new Button("表示");
btn2 = new Button("クリア");
btn3 = new Button("終了");
btn3.setForeground(new Color(255, 0, 0));
btn1.addActionListener(this);
btn2.addActionListener(this);
btn3.addActionListener(this);
pn1.add(btn1);
pn1.add(btn2);
pn1.add(btn3);
例えば以下のようにまとめます。コンポーネントの数が増えるほど有効です。
for(int i=0; i<btn.length; i++){
pn1.add(btn[i]);
}
他はこれまでと同じです。
■ExitDialogクラス側
(1)Dialogクラスを継承し、ActionListenerを実装したオリジナルのダイアログボックスクラスを定義しています。
class ExitDialog extends Dialog implements ActionListener {
(2)イベントハンドラの actionPerformed() メソッド
getActionCommand()メソッドで、クリックされたボタンのコマンド名を取得し、文字列として変数に格納しています。今回はコマンド名を設定していないので、ボタンに表示されている文字が取得されます。
そして格納された文字列によって処理を分岐しています。「はい」がクリックされた場合はシステムを終了し、「いいえ」の場合はダイアログボックスを非表示にしているだけです。
String str = e.getActionCommand();
if( str.equals("はい") ) {
System.exit(0);
} else if( str.equals("いいえ") ) {
setVisible(false);
}
*文字列は参照型変数ですので比較には、equals()メソッドを使います。「==」は使えませんので気をつけてください。
【ワンポイント】
実はオリジナルのダイアログボックスクラスを定義しなくても、PrefFrameクラスの内部にダイアログボックスを定義できます。
dlg = new Dialog(this,"プログラムを終了しますか?");
以下省略
しかしウィンドウ本体のボタンとダイアログボックスのボタンをクリックした時に発生するイベントオブジェクトが同じになるため、イベントハンドラの actionPerformed() メソッドが複雑になります。どのボタンがクリックされたかで条件分岐しないといけないからです。
他の方法としてはイベント処理専用のクラスを作ると、ウィンドウ本体とダイアログボックスのイベントハンドラを分けることができますが、そうするとオリジナルのダイアログボックスクラスを定義する場合とほとんど同じ手間になります。
最初からクラスを別にしたほうが、ウィンドウ本体側のプログラムがシンプルになるので分けました。