広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2011年01月15日

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

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


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


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

前回は、JComboBoxに「明治」「大正」「昭和」「平成」「西暦」
の項目を組み込んだところで終わりました。

このJComboBoxとその右側のテキストフィールドの間には文字が
入っていませんので、ちょっと間が詰まっているように見えた
かもしれません。
そこでこの間の間隔を少し広げてもう少し見栄えよくしておき
ましょう。


では(Eclipseを起動して)HumanResourceEntryPanelのエディター
(WindowBuilder Editor)を開き「Design」タブをクリックして
おいて下さい。そしてエディターを最大化しておきましょう。

(生年月日のラベルの右側に張り付いている)JComboBoxをクリック
し、画面左下のProperties欄の中のConstraintsの配下のinsetsの
右側にある「・・・」というボタンをクリックします。

すると「インセット」ウインドウが開きますのでその中の「右」欄
の数値を10ピクセルに増やしてみて下さい。
そして「OK」ボタンをクリックします。

こうすると、JComboBoxとセルの右(Right)端の間に10ピクセル分の
すきまができます。
(ちなみに「インセット」の中の「上(Top)」、「左(Left)」、「下(Bottom)」
の数値がそれぞれ上端、左端、下端のすきまを指定するものであることは、
言うまでもありません。)

┌補足─────────────────────────┐
 インセット(Inset)は「挿入物」を意味する英単語ですが、
 ここではセルの上端(Top)、左端(Left)、下端(Bottom)、
 右端(Right)に空白を差し込むことを意味します。
└───────────────────────────┘

はい。では、保管(Ctrl+S)した後、HumanResourceJFrameを再度実行
して確認してみてください。


============================================================

これまでの編集作業によって、人事情報の新規登録の画面で社員番号、
氏名、生年月日の入力ができるようになりましたが、この画面の編集は
まだ未完成です。

この新規登録(新人社員の登録)の画面では、さらに社員の所属部署も
入力できるようにしましょう。

以前作成したEMPLOYEE(社員)という(データベースの)テーブルには
DEPART_NUMというカラムがあり、ここには所属部署の部門コードが入る
のでしたね。

でも部門コードを入力するのは大変です。
以前作成したDEPARTMENT(部門)という(データベースの)テーブル
には3つの部署しかありませんでしたが、現実の会社では非常に多く
の部署を持っていますから、それらの部門コードをいちいち覚えてい
るのは大変です。

そこで、画面上では部署名のリストを表示させるようにし、そのリス
トの中から一つ選択すればそれに対応した部門コードが自動的に入力
されるようなプログラムにすべきです。

しかし、その部署名のリストを直接プログラムに組み込むのは(大企業
のように部門の数が多いと)大変ですし、そもそも急成長している企業
では部署(というより組織全体が)がダイナミックに変化していきま
すから、プログラムに直接組み込んでしまうとダイナミックな変化に
対応できなくなってしまいます。

というわけで、部署名のリストはデータベースから取り出して画面上
に表示するようにすべきです。


この部署名のリストも「明治」「大正」「昭和」「平成」「西暦」の
リストを表示させたのと同じようにJComboBoxを使いたいと思うので
すが、データベースから取り出したデータをJComboBoxにリスト表示
する場合には、以前のプログラミングとは異なり、「モデル(Model)」
という特殊なオブジェクトを作成して使用することになります。

ここで「モデル」とはユーザー・インターフェース(ユーザー・インター
フェースはユーザー(人)とコンピューターの間のやりとりをつかさど
るオブジェクト。ここでは要するにGUI部品のこと)に表示したいデータ
部分を表すオブジェクトのことです。
ユーザー・インターフェースがコンピューター内にしか存在しないオブ
ジェクトであるのに対し、モデルは現実世界のオブジェクトをコンピュー
ター内に「モデル化」したものに由来していることから「モデル」と呼
ばれるようになりました。


実は、Swingは、ユーザー・インターフェースのオブジェクトとモデル
のオブジェクトを分離して管理できるように設計されています。

この設計の考え方はModel/View/Controllerデザインパターンと呼ばれ
ている技術の応用です。
デザインパターンについては後に詳述するとして、ここではユーザー・
インターフェース(以下UIと略す)とモデルの分離の意義について
ごく簡単に説明します。

このUIとモデルが分離されていることでうれしいことは、UIの変更と
モデルの変更が互いに独立して行えるということです。

UIの変更は主に画面の見栄えや操作性(両方合わせて「ルック&フィー
ル(Look & Feel)」という言い方がされます)の改善のために頻繁に
行われるのに対し、モデルは基本的に現実世界のオブジェクトに変更が
あったときに変更される、というように互いに変更のタイミングが異な
ります。
また、ひとつのモデルのデータがそれぞれ別々の複数のUIオブジェクト
に表示されたり、プログラムの実行中にUIオブジェクト(のルック&
フィール)が切り替えられる場合もあります。
(ちなみに、SwingではGUIの描画がOSから独立しているため、同じOS上
で別のOSのGUIのルック&フィールを提供することもできます。逆にいう
と、どのOS上でも同じルック&フィールを提供することもできます。)

このような場合でも、UIとモデルが分離され独立して変更できるように
なっていると、互いに影響を与えることなく容易に必要な部分だけの
修正が行えるので、プログラムの作成・変更が楽なのです。


┌補足─────────────────────────┐
 JComboBoxなどのSwingのGUI部品におけるモデル(model)オブ
 ジェクトは、現実世界のオブジェクトをモデル化したものそのもの
 ではなく、GUI部品に表示したいデータのみを扱うものですから、
 現実世界のオブジェクトをモデル化したものはまた別のオブジェ
 クトとして設計されるのが鉄則です。
 またデータといっても、RDBMSに依存する部分はデータベース処理
 専用のオブジェクトを用意して管理させ、モデル・オブジェクト
 とは独立させるのが鉄則です。
 詳しくは後述。
└───────────────────────────┘


では、実際にプログラミングを通じてこの仕組みを理解すること
としましょう。


はい、では以下のようにして「生年月日」のラベルの下に「所属
部署」のラベルを貼り付け、その右側の複数のセルにJComboBoxを
貼り付けましょう。

(1) まず、パレット(Palette)のComponentsの中のJLabelをクリッ
クし、マウス・ポインターを「生年月日」のラベルの下
(「column 0, row 4」という文字列が表示されるところ)でクリッ
クします。

(2) そして、画面左下のProperties欄の中のtextの値(現在「New label」
という値になっているはず)を「所属部署」に変更します。

(3) パレット(Palette)の中のJComboBoxをクリックし、
「所属部署」のラベルの右(「column 1, row 4」という文字列が表示
されるところ)でクリックします。

(4) 貼り付いたJComboBoxの周囲に表示されているハンドルのうち、
右端のハンドルをドラッグして、その行の一番右側のセル(つまり
「日」のテキストフィールドの下)でドロップ(マウスのボタンから
手を離す)します。

これで「所属部署」ラベルの右側に貼り付いたJComboBoxが7個のセル
いっぱいに広がりましたね。

ここに部署名のリストを表示させるためには、別途、モデルのオブジェ
クトを作る必要があります。


JComboBoxに対応したモデル・オブジェクトはComboBoxModelという
インターフェイス(interface)を実装するというルールになって
いる(このインターフェイスを実装するというルールを守ることに
よってモデル・オブジェクトをJComboBoxから独立してコーディング
できる)のですが、このインターフェイスはListModelというイン
ターフェイスを拡張(extends)したものです。

そしてListModelをある程度実装したAbstractListModelというクラス
もあります。

(これらのインターフェイスやクラスはすべてSwingのパッケージの
中に用意されているものです。)

というわけで、ComboBoxModelを実装するクラスとしてAbstractListModel
のサブクラスを作りましょう。

そうすれば、AbstractListModelによって実装済みの部分はそのまま利用
することができるので、ComboBoxModelのメソッドのうちの最小限の実装
だけで済みます。

クラス名もずばり「ComboBoxModelOfDepartment」としましょう。

以下がそのコーディング例です・・・

と言いたいところですが、時間切れになりましたので、続きは
また次回に。

(続く・・・)


では、また来週。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      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. 不許無断複製