広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2011年10月31日

    Java総合講座 - 初心者から達人へのパスポート
                  2009年11月開講コース 043号

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:vol.xxx(xxxは番号)が振られています。
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:xxx号(xxxは番号)が振られています。
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 01.データベースを使用するアプリケーションの開発(続き)
========================================================

では、前回の演習問題の答でお約束したように、(データベースへの)
データの登録が完了したことを示すメッセージを表示させるように
アプリケーションをさらに改良していきましょう。


ここまで作ってきたアプリケーションの本体はJFrameを使ったウイ
ンドウでした。これは、アプリケーションの中で主として使われる
主要な(main)ウインドウであるため、メイン・ウインドウ(main window)
と呼ばれることがあります。
一方、メイン・ウインドウに付随して副次的に使用され、何らかの
メッセージを表示したり、簡単なデータの入力や確認要求などを行う
目的で使用されるウインドウをダイアログ・ウインドウもしくはダイ
アログ・ボックスと呼びます。

Swingの場合、ダイアログ・ウインドウはJDialogというクラスをベース
にして作成します。

ダイアログ・ウインドウは基本的にはメイン・ウインドウの手前に表示
され、それを閉じないことにはメイン・ウインドウの操作に戻れない
「モーダル」モードと、ダイアログ・ウインドウを開いたままでもメイン・
ウインドウの操作に戻れる「モードレス」モードという2種類のモードが
あります。

今回はモーダルのダイアログ・ウインドウを開いてメッセージを表示する
方法を説明します。


では、Eclipseを起動して

(1) パッケージ・エクスプローラーの中のJStudy1(プロジェクト)の配下
のsrcの配下のjp.co.flsi.lecture.ui(パッケージ)を右クリックします。

(2) 「新規」→「その他」を選択します。

(3) 「Windowbuilder」配下の「Swing Designer」配下の「JDialog」を選択し、
「次へ」ボタンをクリックします。

(4) 「ソース・フォルダー」に「JStudy1/src」、「パッケージ」に
「jp.co.flsi.lecture.ui」が入力されていることを確認し、「名前」の欄に
MessageDialog
と入力しましょう。

(5) 「Generate JDialog with OK and Cancel buttons」の項目はチェック・
マークが付いたままにしておきましょう。

(6)「スーパークラス」が「javax.swing.JDialog」になっていることを確認し、
「完了」ボタンをクリックします。

MessageDialog.javaの編集画面になりますね。

例によって、下のほうに3つ並んでいるタブのうちの「Design」タブを
クリックしましょう。

ビジュアルなエディター画面(以後、Designビュー(Design View)と呼ぶ)
が表示されたら、例によって「MessageDialog.java」タブをダブル・クリック
することによってエディター画面を最大化しましょう。


このMessageDialogのタイトル・バーに「メッセージ」という文字列
を書き込んでおきましょう。
DesignビューのMessageDialogのウインドウのタイトル・バーをクリック
してから、左側のProperties欄の中を見て下さい。
下の方(たぶんスクロールしないと見られないはず)にtitleという項目
がありますね。この項目の右側の入力域をクリックして、そこに
「メッセージ」と入力し、Enterキーを押します。

すると、MessageDialogのタイトル・バーに「メッセージ」という文字列が
現れますね。


では次に、メッセージを表示させるためのGUI部品を貼り付けたいのですが、
その前に、貼り付ける土台を整備しておきましょう。

このMessageDialogのウインドウのお腹(タイトル・バーの下の広い領域)
には予めJPanelが張り付いています。
これのレイアウトをBorderLayoutにしましょう。

(7) DesignビューのMessageDialogのウインドウのお腹をクリックし、
左側のProperties欄の「Layout」の右側の三角形のアイコンのボタンを
クリックしてリストを表示し、リストの中のBorderLayoutを選択します。
これで、レイアウトがBorderLayoutに変わりました。(他の操作方法と
して、PaletteのLayouts配下から貼り付けるという方法もありますが、
説明は省略します。)


続いて、メッセージを表示させるためのGUI部品としてJTextPaneを貼り
付けることにしましょう。

JTextPaneは複数行の文字列を表示できるGUIコンポーネントです。今回
はメッセージが複数行になる可能性もあるため、このコンポーネントを
使って表示させるのです。

(8) Palette(パレット)のComponents配下からJTextPaneを選択し、
MessageDialogのウインドウのお腹(先ほどBorderLayoutに変更した所)
のCenterの部分をクリックすることによって、そこに貼り付けましょう。


続いて、このダイアログ・ウインドウを閉じるためのボタンを用意したい
のですが、予め「OK」「Cancel」のボタンが用意されている(これはこの
クラスの新規作成時に「Generate JDialog with OK and Cancel buttons」
という項目にチェック・マークを付けておいたために自動的に用意された
ものです)ので、これを修正して使うことにしましょう。

(9) 「Cancel」ボタンは必要ないので削除(ボタンをクリックして、
Deleteキーを押すか、あるいは、ボタンを右クリックして「削除」を
選択する)しましょう。

(10)「OK」ボタンをクリックし、Properties欄のtextの値を「閉じる」
という文字列に書き換えて、Enterキーを押しましょう。(「OK」ボタン
を押すとダイアログ・ウインドウを閉じるというのでも操作上は問題
ないかも知れませんが、エラー・メッセージが表示されていても「OK」
というのは何か違和感があるので、「閉じる」という無難なボタン表示
にしました。)

これでボタンの表示が「閉じる」に変わりましたね。
しかし、このボタンは右端に寄っていて、見かけ上あまり格好よくあり
ません。真ん中に揃えるようにしてみましょう。

(11) この「閉じる」ボタンが貼りついている土台になっている細長い
パネル(これもJPanel)をクリックします。

(12) Properties欄のVariableが「buttonPane」(これはWindowBuilder
によって自動的に生成されたJPanelの変数名)になっていることを確認し、
その下の「Layout」の配下(左側の[+]ボタンをクリックして展開する)
の「alignment」の右側(現在は「RIGHT」という表示になっているはず)
をクリックすると、リストが表示されるので、その中から「CENTER」を
選択します。

これで、「閉じる」ボタンが真ん中に揃いますね。



ではこの「閉じる」ボタンをクリックしたらこのダイアログ・
ウインドウが閉じるようにコーディングしましょう。

(13) この「閉じる」ボタンを右クリックして、「Add event handler」
→「アクション」→「actionPerformed」を選択します。

(14) すると、ソース・コードの中に

--------------------------------------------------------
okButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
   }
});
--------------------------------------------------------

というコードが自動挿入されます。

(15) このコードを次のコードに書き換えましょう。

--------------------------------------------------------
okButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
      setVisible(false);
      dispose();
   }
});
--------------------------------------------------------

変更点は

setVisible(false);
dispose();

の2行を追加したことだけですね。

ここで、setVisible(false)というメソッドはこのウインドウを見えなくし、
dispose()というメソッドはこのウインドウをメモリー上のオブジェクトごと
消滅させます。この操作によってこのダイアログ・ウインドウが閉じられた
ことになります。



あと残っている作業として、このMessageDialogの外から供給したメッセージ(文字列)
をJTextPaneに表示させられるようにしておきましょう。(このJTextPaneはこの
ダイアログ・ウインドウの中にカプセル化されているため、このままでは外部から
アクセスできません。)
やり方は色々ありますが、ここでは一番簡単に(WindowBuilderの「Expose component」
という機能を紹介するためにも)このJTextPaneコンポーネント自体に外部から
アクセスできるようにしておきます。

(16) Designビューに戻って(Designタブをクリックして)、MessageDialogの
ウインドウのお腹に張り付いているJTextPaneを右クリックし、「Expose component」
を選択します。

(17) 「Expose component」ウインドウが開いたら、メソッド名(「getTextPane」に
なっているはず)を確認し、Modifierはpublicが選択されていることを確認し、
「OK」ボタンをクリックします。

これで、getTextPane()というpublicなメソッドが自動的に生成され(ソース・コード
を自分で確認してみて下さい)、このメソッドを通して外部からこのJTextPaneに
アクセスできるようになりました。


以上で、MessageDialogは完成です。
Ctrl + Sで保管しておいて下さい。


このMessageDialogのインスタンスをどこかで生成してgetTextPane()メソッド
を呼び出してメッセージを設定すれば、メッセージを表示するダイアログ・ウイン
ドウが表示されます。



では、MessageDialogのインスタンスを生成してgetTextPane()メソッドを
呼び出すほうのソース・コードを書きましょう。

HumanResourceEntryPaneのエディターを開いてください。


まず先に、MessageDialogのインスタンスを遅延生成するソース・コードを
書きましょう。

HumanResourceEntryPaneのソース・コードの先頭のほうの、フィールドの定義
が並んでいるところ(例えば「private JButton button;」の下)に
下記のフィールドの定義を入れてください。
--------------------------------------------------------
private MessageDialog msgDialog = null;
--------------------------------------------------------
これはMessageDialogのインスタンスを代入するためのフィールド(変数)です。

MessageDialogのインスタンスを遅延生成する、下記のようなgetメソッド(getter)
をHumanResourceEntryPaneのソース・コードの一番下(getButton()メソッドの下、
一番最後の}の上)に入れてください。
--------------------------------------------------------
private MessageDialog getMessageDialog() {
   if (msgDialog == null) {
      msgDialog = new MessageDialog();
      msgDialog.setModal(true);
   }
   return msgDialog;
}
--------------------------------------------------------
setModal(true)は、このダイアログ・ウインドウをモーダルに設定するための
メソッド呼び出しです。
ここでモーダルに設定してあるので、このダイアログ・ウインドウを開いている間
はメイン・ウインドウ(HumanResourceJFrame)に戻って操作を行うことはできない
ことになります。


次に、getButton()メソッドの中の(最後のほうの)
--------------------------------------------------------
empDbManager.insertData(anEmployee);
--------------------------------------------------------
の行を下記のように書き換えましょう。

--------------------------------------------------------
if (empDbManager.insertData(anEmployee)) {
   getMessageDialog().getTextPane().setText("新規登録が完了しました。");
}
else {
   getMessageDialog().getTextPane().setText("指定された社員番号がすでに存在するため、新規登録はできませんでした。");
}
getMessageDialog().setVisible(true);
--------------------------------------------------------

EmployeeDbManagerのinsertData()メソッドは、指定された社員番号がすでに存在する
ときにはfalseを返すようにしていましたね。そこで上のようにif文を使って
MessageDialogに設定するメッセージを振り分けています。

ここで、getTextPane().setText("・・文字列・・")はMessageDialogに貼り付けて
あるJTextPaneのsetText()メソッドを呼び出すことによって、引数の文字列を
JTextPane上に書き出します。
ここでは、先ほどWindowBuilderの「Expose component」機能を使って自動生成
したgetTextPane()メソッドによって、MessageDialogの中のJTextPaneにアクセス
できることにも注目して下さい。

setVisible(true)はこのウインドウ(MessageDialog)を目に見えるようにします。

なお、もしgetTextPane().setText("・・文字列・・")を実行する前にsetVisible(true)
を実行してしまうと、メッセージの無い状態でMessageDialogが表示されてしまい
ますので、必ずgetTextPane().setText("・・文字列・・")を実行した後で
setVisible(true)を実行するように、実行の順番に注意する必要があります。


これで、EMPLOYEEテーブルへのデータの追加に成功すればダイアログ・ウインドウ
を開いて「新規登録が完了しました。」というメッセージを表示し、同じ社員番号
がすでに存在しているためにデータを追加できない場合はダイアログ・ウインドウ
を開いて「指定された社員番号がすでに存在するため、新規登録はできませんでした。」
というメッセージを表示することになります。



ここでHumanResourceJFrameを起動し、ダイアログ・ウインドウ(MessageDialog)
の動作を確認してみてください。
MessageDialogが開いている間は、HumanResourceJFrameに戻って操作を行うこと
ができないことも確認してください。
(なおMessageDialogがHumanResourceJFrameに覆いかぶさっていると確認ができま
せんから、MessageDialog(のタイトル・バーを)をドラッグして移動しておいて
から、HumanResourceJFrameに触ってみてください。)



では、次に、社員番号に何も入力されなかった場合や、数字以外の文字が入力さ
れた場合にもMessageDialogを開いてわかりやすい(エラーの)メッセージを表示
するようにしましょう。

(次回に続く。)



では、また来週。



========================================================
◆ 02.文法解説 [演算子]
========================================================

[算術をともなう代入演算子]

Javaでは = の記号は左辺と右辺が等しいことを表すのではなく、右辺の値
を左辺に代入するという演算を表す一種の演算子であることはすでに述べま
した。

この代入演算子(assignment operator)の仲間として、= の前に算術用の
二項演算子(+, -, *, /, %)がくっついたものがあります。
これは代入演算子(=)と算術用の二項演算子を合成したような働きを持つ
演算子で、以下のようなものがあります。

演算子   機能
------ ---------------------------
+=    右辺の値を左辺の値に足した結果を左辺に代入する
      (x += 100;はx = x + 100;と同じ)

-=    右辺の値を左辺の値から引いた結果を左辺に代入する
      (x -= 100;はx = x - 100;と同じ)

*=    右辺の値を左辺の値に掛けた結果を左辺に代入する
      (x *= 100;はx = x * 100;と同じ)

/=    左辺の値を右辺の値で割った結果を左辺に代入する
      (x /= 100;はx = x / 100;と同じ)

%=    左辺の値を右辺の値で割って、その余りを左辺に代入する。
      (x %= 100;はx = x % 100;と同じ)


なお、代入演算子は、右辺の値を左辺に代入するだけでなく左辺に代入
した値がその場に返ってくるようになっています。

たとえば、

int x = 10;
int y, z;
z = (y = x + 20) * 2;

を実行すると、まず y = x + 20 の演算が行われてyに(10 + 20の計算結果の
30)が代入され、y = x + 20 の場所に30という値が返ってきます。
したがって、続いて

z = (30) * 2;

の演算をすることになり、Zに(30 * 2の計算結果の)60が代入されることに
なります。

これは算術をともなう代入演算子でも同様で、たとえば、

int y = 10;
int z;
z = (y += 20) * 2;

を実行すると、まず y += 20 の演算が行われてyに(10 + 20の計算結果の
30)が代入され、y += 20 の場所に30という値が返ってきます。
したがって、続いて

z = (30) * 2;

の演算をすることになり、Zに(30 * 2の計算結果の)60が代入されること
になります。



================================================
◆ 03.演習問題
================================================

上記の演算子の振る舞いを確認するために、下記のようなプログラムを作っ
て実行してみてください。

--------------------------------------------------------
public class ArithmeticOperationTest5 {

   public static void main(String[] args) {
      int x = 10;
      int y, z;
      z = (y = x + 20) * 2;
      System.out.println("[Example 1]");
      System.out.println("int x = 10;");
      System.out.println("int y, z;");
      System.out.println("z = (y = x + 20) * 2;");
      System.out.println("Result: y = " + y);
      System.out.println("Result: z = " + z);

      int y1 = 10;
      int z1;
      z1 = (y1 += 20) * 2;
      System.out.println("\n[Example 2]");
      System.out.println("int y = 10;");
      System.out.println("int z;");
      System.out.println("z = (y += 20) * 2;");
      System.out.println("Result: y = " + y1);
      System.out.println("Result: z = " + z1);
   }
}
--------------------------------------------------------



(次回に続く。)


では、また来週。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2011 Future Lifestyle Inc. 不許無断複製