AWT から Swing への変更に専念してもらうため、ダイアログボックスは JOptionPane クラスを使わずに、JDialogクラスを使っています。つまりほとんどそのまま書き換えて欲しいということです。
また今後はデータの追加、更新、削除を行うプログラムを作りますが、その時に簡単な JOptionPane クラスだけでなく、JDialog クラスの使い方も知っておくと、より細かいダイアログボックスが作れて応用できるからです。
【1】sample208 フォルダをフォルダごとコピーして、sample211 フォルダを作ります。

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

*SampleDb030.class を忘れないようにしてください。
【3】PrefTest.java を以下のように変更します。
*「\」はWindowsではエンマークのことです。
保存先 C:\java\sample211
ファイル名 PrefTest.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
class PrefFrame extends JFrame implements ActionListener {
Container cp;
JLabel lb1;
JTextArea txtar1;
JButton btn1, btn2, btn3;
ExitDialog dlog;
JMenuItem mi1, mi2, mi3, mi4, mi5, mi6,mi7;
public PrefFrame(String title) {
//フレームのタイトル
setTitle(title);
//コンテンツペイン取得
cp = getContentPane();
//ウィンドウを閉じる時
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dlog.setVisible(true);
}
});
//メニューバーの生成
JMenuBar mb = new JMenuBar();
//メニューの生成
JMenu mn1 = new JMenu("ファイル");
JMenu mn2 = new JMenu("編集");
JMenu mn3 = new JMenu("検索");
//メニュー項目の生成
mi1 = new JMenuItem("表示");
mi2 = new JMenuItem("クリア");
mi3 = new JMenuItem("終了");
mi4 = new JMenuItem("追加");
mi5 = new JMenuItem("更新");
mi6 = new JMenuItem("削除");
mi7 = new JMenuItem("検索");
//イベントリスナーの登録
mi1.addActionListener(this);
mi2.addActionListener(this);
mi3.addActionListener(this);
//メニューへの追加
mn1.add(mi1);
mn1.add(mi2);
mn1.addSeparator(); //セパレーター
mn1.add(mi3);
mn2.add(mi4);
mn2.add(mi5);
mn2.add(mi6);
mn3.add(mi7);
//メニューバーへの追加
mb.add(mn1);
mb.add(mn2);
mb.add(mn3);
//メニューバーをフレームへ追加
setJMenuBar(mb);
//ラベル
lb1 = new JLabel("ボタンをクリックしてください。", SwingConstants.CENTER);
lb1.setOpaque(true);
lb1.setFont(new Font("Serif", Font.BOLD, 12));
lb1.setBackground(Color.WHITE);
lb1.setForeground(Color.BLUE);
cp.add(lb1, BorderLayout.NORTH);
//テキストエリア
txtar1 = new JTextArea();
txtar1.setFont(new Font("Dialog", Font.PLAIN, 14));
txtar1.setForeground(new Color(64, 64, 64));
cp.add(txtar1, BorderLayout.CENTER);
//パネル
JPanel pn1 = new JPanel();
pn1.setLayout(new GridLayout(1, 3));
//ボタンの設定
btn1 = new JButton("表示");
btn2 = new JButton("クリア");
btn3 = new JButton("終了");
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);
//パネルを追加
cp.add(pn1, BorderLayout.SOUTH);
//ダイアログボックス生成
dlog = new ExitDialog(this, "プログラムを終了しますか?");
}
public void actionPerformed (ActionEvent e) {
Object obj = e.getSource();
if (obj == btn1 || obj == mi1) {
prefDisplay();
lb1.setText("表示しました。");
}else if (obj == btn2 || obj == mi2) {
txtar1.setText("");
lb1.setText("クリアしました。");
}else if (obj == btn3 || obj == mi3) {
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 JDialog implements ActionListener {
Container cp;
public ExitDialog(JFrame parent, String title) {
//スーパークラスのコンストラクタを呼び出す
super(parent, title);
//コンテンツペイン取得
cp = getContentPane();
//ダイアログボックスを閉じる時
addWindowListener( new WindowAdapter () {
public void windowClosing(WindowEvent e) {
setVisible(false);
}
});
//ダイアログボックスの設定
setLocation(320, 300);
setSize(220, 80);
cp.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
cp.setBackground(Color.LIGHT_GRAY);
//ボタンの設定
JButton btnYes = new JButton("はい");
JButton btnNo = new JButton("いいえ");
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);
cp.add(btnYes);
cp.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.cp.setBackground(Color.LIGHT_GRAY);
frm.setVisible(true);
}
}
【4】コマンドプロンプトを起動して、カレントディレクトリを sample211 に切り替えます。

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

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

【7】Swing 版の都道府県マスターが表示されました。

*Swingでは「Metal」というデザインがデフォルトなので、概観がこれまでと少し変わっています。デザインはあとで変更できます。
【8】「表示」ボタンをクリックします。

【9】データが表示されました。

【10】他のボタンやメニューも、これまでと同じように動くことを確認してください。
【解説】
(1)パッケージのインポート部分です。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
「javax.swing.event.*;」をインポートしていない点に注目してください。Swing でもイベント処理は AWT のクラスを使います。「javax.swing.event」パッケージは Swing から追加されたコンポーネントに必要な、不足している部分を補うものなので今回は不要です。
また、Font クラスや Color クラスは Swing でも AWT のクラスを利用するので、「import java.awt.*;」が必要です。
(2)Swing では JFrame クラスを継承します。
class PrefFrame extends JFrame implements ActionListener {
(3)Swing では コンテンツペインの取得が必要です。
・フィールド変数
Container cp;
・コンストラクタ内で取得
cp = getContentPane();
(4)Swing のコンポーネントに変更しています。
Label → JLabel
TextArea → JTextArea
Button → JButton
MenuItem → JMenuItem
MenuBar → JMenuBar
Panel → JPanel
*コンポーネントのクラス名が変わるので、当然コンストラクタも変わることに注意してください。意外と忘れがちな点です。
例 JMenuBar mb = new JMenuBar();
(5)ウィンドウを閉じる時に、ハングアップしないために以下の文が必要です。
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
(6)メニューバーを追加するメソッドが変わります。
setMenuBar(mb); → setJMenuBar(mb);
(7)ラベルの文字の配置に使う定数が変わります。
lb1 = new JLabel("ボタンをクリックしてください。", SwingConstants.CENTER);
Label.CENTER → SwingConstants.CENTER
(8)ラベルはデフォルトで透明なので、背景色を表示するため不透明にしています。
lb1.setOpaque(true);
違いはこの一文をコメントにして実行するとわかります。そのときは再コンパイルを忘れずに。
(9)メニューバー以外のコンポーネントやパネルはコンテンツペインに対して追加します。
cp.add(txtar1, BorderLayout.CENTER);
cp.add(lb1, BorderLayout.NORTH);
cp.add(pn1, BorderLayout.SOUTH);
(10)Swingのダイアログボックスは JDialog クラスを継承します。
class ExitDialog extends JDialog implements ActionListener {
(11)SwingのデフォルトのレイアウトはBorderLayoutです。変更する場合はコンテンツペインに対して行います。
cp.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
(12)Swing では背景色の変更はコンテンツペインに対して行います。
・クラス内の場合
cp.setBackground(Color.LIGHT_GRAY);
・他のクラスから設定する場合はインスタンス名から指定
frm.cp.setBackground(Color.LIGHT_GRAY);
【ワンポイント】
AWT から Swingへの変更は、上記の点に注意するとそれほど難しくありません。以下に重要なポイントをもう一度まとめます。
1.コンポーネントは頭文字に「J」を付けたクラスに変更。(コンストラクタも変わる)
2.コンポーネントの追加、背景色の変更、レイアウトの変更はコンテンツペインに対して行う。
3.メソッドや定数が変わることもあるので、API仕様でクラスを調べることも大事。
API仕様でクラスを調べる場合は、そのクラスのスーパークラスに遡って調べなければ、目的の定数やメソッドが見つからないこともありますので、覚えておいてください。