Java Swingでダイアログボックスを表示する方法。

JavaのSwingには JOptionPane クラスがあるため、AWTのDialogクラスに比べるとダイアログボックスの表示がだいぶ楽になりました。

独自にダイアログボックスのクラスを定義しなくても、ダイアログボックスの表示位置や、ボタンの配置は自動なので、プログラムがシンプルに書けます。


【1】sample209 フォルダをフォルダごとコピーして、sample210 フォルダを作ります。

java-519.gif


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

java-520.gif


【3】PrefTest.java を以下のように変更します。

*「\」はWindowsではエンマークのことです。

保存先 C:\java\sample210
ファイル名 PrefTest.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class PrefFrame extends JFrame {
  Container cp;

    public PrefFrame(String title) {
      //フレームのタイトル
      setTitle(title);

      //コンテンツペイン取得
      cp = getContentPane();

      //ウィンドウを閉じる時
      setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

      addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {

          //ダイアログボックスの表示
          int ret = JOptionPane.showConfirmDialog (cp, "プログラムを終了しますか?", "確認", JOptionPane.YES_NO_OPTION);

          if(ret == JOptionPane.YES_OPTION) {
            System.exit(0);
          }

        }
      });

    }

}


public class PrefTest {

  public static void main(String args[]) {
    PrefFrame frm = new PrefFrame("都道府県マスター");
    frm.setLocation(300, 200);
    frm.setSize(250, 350);
    frm.cp.setBackground(Color.LIGHT_GRAY);
    frm.setVisible(true);
  }

}



【4】コマンドプロンプトを起動して、カレントディレクトリを sample210 に切り替えます。

java-521.gif


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

java-522.gif


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

java-523.gif


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

java-524.gif


【8】ウィンドウを閉じてみましょう。

java-525.gif


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

java-526.gif


【10】先に「いいえ」ボタンをクリックします。

java-527.gif


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

java-529.gif


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

java-528.gif


【13】ウィンドウが閉じ、コマンドプロンプトは次の命令を入力できる状態になりました。

java-530.gif


【解説】

(1)Swingでもイベント処理はAWTのクラスを使うため、以下のパッケージをインポートする必要があります。

import java.awt.event.*;

*Swingにもイベント処理に関わるクラスがありますが、それはSwing独自のイベント分を補うもので、やはりメインはAWTです。


(2)コンテンツペインを取得するため、参照型変数を用意しています。この変数はPrefFrame クラスのメソッドや、PrefTestクラスからも参照されるため、フィールド変数として宣言しています。

Container cp;


(3)コンテンツペインは PrefFrame クラスのコンストラクタで取得しています。Swingではメニューバー以外のコンポーネントはコンテンツペイン上に配置する必要があります。

cp = getContentPane();


(4)無名内部クラスでも閉じる時の処理を書いているので、以下の文は必要なさそうですが、
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

この処理がないとダイアログボックスで「いいえ」ボタンをクリックした時に、コマンドプロンプトに正常に戻れません。コマンドプロンプトが入力を受け付けなくなります。

ハングアップした状態
java-531.gif

ハングアップした場合は「Ctrlキー」+「Cキー」で正常に戻ります。
java-532.gif


(5)JOptionPane クラスの showConfirmDialog() メソッドは static なので、インスタンスを生成しなくても使えます。 クラス名.メソッド名()

またユーザーの選択により戻り値を返しますので、int型の変数 ret で受け取っています。

引数に this ではなくコンテンツペインの cp を指定することで、ダイアログボックスがフレームの中央に自動で表示されます。(フレームを移動しても自動で中央になる)

int ret = JOptionPane.showConfirmDialog (cp, "プログラムを終了しますか?", "確認", JOptionPane.YES_NO_OPTION);


(6)もし「はい」がクリックされていた場合は、システムを終了しています。
if(ret == JOptionPane.YES_OPTION) {
  System.exit(0);
}


(7)PrefTest クラス
今回と前回の書き方をくらべてみてください。今回コンテンツペインはPrefFrame クラスのコンストラクタで取得していますので、インスタンスを生成したあとは、「インスタンス名.cp」で参照できます。

・今回
frm.cp.setBackground(Color.LIGHT_GRAY);

・前回
frm.getContentPane().setBackground(Color.LIGHT_GRAY);


sample208の時と比べると、ダイアログボックスの表示に関する部分が、だいぶ簡単になったことがわかると思います。


スポンサードリンク

スポンサードリンク






Java初心者入門講座TOPへ