■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2007年02月25日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.041

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


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

さて、前回はHumanResourceEntryPaneのソース・コードの中の
getJComboBox1()メソッドの編集内容まで説明しました。

では、このgetJComboBox1()メソッドはどこで呼び出されている
かというと、VisualEditorが自動生成したソース・コードの中で
呼び出されています。

詳しく説明しているとあまりにも時間がかかってしまいますので、
概略だけ説明すると、HumanResourceEntryPaneのコンストラクター
の中でinitialize()というメソッド(初期設定を行うためのメソッ
ド)を呼んでおり、initialize()メソッドの中でgetJPanel()メソッ
ド、getJPanel()メソッドの中でgetJComboBox1()メソッドという順
に呼び出しています。
そしてHumanResourceEntryPane自体は、HumanResourceJFrameに貼り
付けてありますから、HumanResourceJFrameのアプリケーションを
起動したときにHumanResourceEntryPaneのコンストラクターが呼び
出される(HumanResourceEntryPaneのインスタンスが生成される)
ようなソース・コードになっています。

力のある人は自動生成されたソース・コードを自分で全部調べてみ
てください。

そこまで力はないと思う人もご安心ください。
このメールマガジンを読んでいるうちに、段々とソース・コードの
分析力もついてきます。


では、これまでに説明したソース・コードを実際にEclipseに入力/
編集して動作を確認してみましょう。
(以下のEclipseへの入力/編集作業を既に自力で終えている人は
適時、読み飛ばしてください。)


では、まずEclipseを起動してください。


Departmentクラスのソース・コードから入力していくことにしま
しょう。
このクラスはjp.co.flsi.lecture.entityというパッケージに入れ
ることにしていましたから、最初に、jp.co.flsi.lecture.entity
パッケージを作っておきましょう


┌───────────────────────────┐
     jp.co.flsi.lecture.entityパッケージの作成
└───────────────────────────┘

(1) パッケージ・エクスプローラーのJStudy1(プロジェクト)を
右クリックし、「新規」→「パッケージ」を選択します。

(2) 「新規Javaパッケージ」ウインドウで「ソース・フォルダー」
の欄に「JStudy1」がはいっていることを確認し、「名前」の欄に
「jp.co.flsi.lecture.entity」と入力し、「終了」ボタンをクリ
ックします。

これで、JStudy1プロジェクトの下にjp.co.flsi.lecture.entityパ
ッケージが作られましたね。

次に、このパッケージの中にDepartmentクラスを作成しましょう。


┌───────────────────────────┐
     Departmentクラスの作成
└───────────────────────────┘

(1) パッケージ・エクスプローラーにできたjp.co.flsi.lecture.entity
(パッケージ)を右クリックし、「新規」→「クラス」を選択します。

(2) 「新規Javaクラス」ウインドウで「ソース・フォルダー」の欄
に「JStudy1」がはいっていることを確認し、「パッケージ」の欄に
「jp.co.flsi.lecture.entity」がはいっていることを確認し、
「名前」の欄に「Department」と入力します。

(なお、「作成するメソッド・スタブの選択」の
「public static void main(String[] args)」や
「スーパークラスからのコンストラクター」にはチェックマークは
入れないでください。)

(3) 「終了」ボタンをクリックします。

そうすると、Departmentのエディターが開きますので、Departmentの
ソース・コード(下に再度提示します)を完成させましょう。

--------------------------------------------------------
package jp.co.flsi.lecture.entity;

public class Department {
   private int departmentNumber;
   private String departmentName;
   private String location;

   public void setDepartmentNumber(int departmentNumber) {
      this.departmentNumber = departmentNumber;
   }
  
   public int getDepartmentNumber() {
      return departmentNumber;
   }
  
   public void setDepartmentName(String departmentName) {
      this.departmentName = departmentName;
   }
  
   public String getDepartmentName() {
      return departmentName;
   }
  
   public void setLocation(String location) {
      this.location = location;
   }
  
   public String getLocation() {
      return location;
   }

}
--------------------------------------------------------

続いてComboBoxModelOfDepartmentのソース・コードを入力して
いくことにしますが、このクラスはjp.co.flsi.lecture.ui.model
というパッケージに入れることにしていましたから、
jp.co.flsi.lecture.ui.modelパッケージを作っておきましょう


┌───────────────────────────┐
     jp.co.flsi.lecture.ui.modelパッケージの作成
└───────────────────────────┘

(1) パッケージ・エクスプローラーのJStudy1(プロジェクト)を
右クリックし、「新規」→「パッケージ」を選択します。

(2) 「新規Javaパッケージ」ウインドウで「ソース・フォルダー」
の欄に「JStudy1」がはいっていることを確認し、「名前」の欄に
「jp.co.flsi.lecture.ui.model」と入力し、「終了」ボタンをク
リックします。

これで、JStudy1プロジェクトの下にjp.co.flsi.lecture.ui.model
パッケージが作られましたね。

次に、このパッケージの中にComboBoxModelOfDepartmentクラスを
作成しましょう。


┌───────────────────────────┐
     ComboBoxModelOfDepartmentクラスの作成
└───────────────────────────┘

(1) パッケージ・エクスプローラーにできたjp.co.flsi.lecture.ui.model
(パッケージ)を右クリックし、「新規」→「クラス」を選択します。

(2) 「新規Javaクラス」ウインドウで「ソース・フォルダー」の欄に
「JStudy1」がはいっていることを確認し、「パッケージ」の欄に
「jp.co.flsi.lecture.ui.model」がはいっていることを確認し、
「名前」の欄に「ComboBoxModelOfDepartment」と入力し、
「スーパークラス」の右側の「参照」ボタンをクリックします。

(3) 「スーパークラスの選択」ウインドウの入力欄に「AbstractListModel」
を入力するとその下の「一致する型」の欄に「AbstractListModel - javax.swing」
というのが表示されるのでそれを選択(クリック)し、「OK」ボタンを
クリックします。
これで、「スーパークラス」の欄に「javax.swing.AbstractListModel」
が入力されたことを確認してください。

(4) 「インターフェース」の右側の「追加」ボタンをクリックします。

(5) 「実装されたインターフェースの選択」ウインドウの入力欄に
「ComboBoxModel」を入力するとその下の「一致する型」の欄に
「ComboBoxModel- javax.swing」というのが表示されるのでそれを
選択(クリック)し、「追加」ボタンをクリックしてから「OK」ボタ
ンをクリックします。

┌補足─────────────────────────┐
上の「実装されたインターフェースの選択」という翻訳は、ずば
り言って「実装されるインターフェースの選択」の間違いですね
(原本は「Implemented Interfaces Selection」)。
これから実装するという段階なのに、既に「実装された」という
過去形になっているのがおかしいことは誰にもわかることだと思
いますので、さらっと見流すことにしましょう。

「Eclipseはこれだけ優れた機能を豊富に持っているのに何で無料
なの?」という驚きに比べれば、こんな誤訳なんて大して気になら
ないものです。

不具合といえば、VisualEditorにも結構不具合があって、表示され
るべき画像が表示されなかったりするときもあったりしますが、こ
れも気にしないようにしましょう。

世でよく使われている有料の(高価な)開発ツールでも不具合が
たくさんあるのに対して、こちらは無料ですし、無料にもかかわ
らず有料ソフトよりも優れた機能を豊富に持っているのです。

「Eclipseを使っていて損はない」ということだけは、はっきり
言っておきます。
└───────────────────────────┘

(6) 「作成するメソッド・スタブの選択」の欄は「継承された
抽象メソッド」だけにチェックマークがはいっている状態にして
「終了」ボタンをクリックします。

(抽象メソッドは実装されていないメソッドなので、これから実装
する必要があります。
また、「メソッド・スタブ(method stub)」というのは中身(ロジ
ック部分)が空っぽのメソッドのことです(後述)。)

そうすると、ComboBoxModelOfDepartmentのエディターが開いて
下記のようなソース・コードが表示されますね。

--------------------------------------------------------
package jp.co.flsi.lecture.ui.model;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;

public class ComboBoxModelOfDepartment extends AbstractListModel implements
      ComboBoxModel {

   public Object getSelectedItem() {
      // TODO 自動生成されたメソッド・スタブ
      return null;
   }

   public void setSelectedItem(Object anItem) {
      // TODO 自動生成されたメソッド・スタブ

   }

   public Object getElementAt(int index) {
      // TODO 自動生成されたメソッド・スタブ
      return null;
   }

   public int getSize() {
      // TODO 自動生成されたメソッド・スタブ
      return 0;
   }

}
--------------------------------------------------------

ここで、「TODO 自動生成されたメソッド・スタブ」とコメント
が書かれているメソッドは、各インターフェースのうち未実装の
メソッドです。
メソッド・スタブというのは、このように中身(自分でプログ
ラミングすべき部分=ロジックの部分)を除いたソース・コード
が提供されるもので、このメソッドの中身は自分で実装(プログ
ラミング)する必要があります。

そういう意味で、このコメントには「TODO」(= to do)と書い
てあります。
(ちなみに、アメリカのビジネスマンはよくTO-DO Listと称して、
やるべきこと(to do)を紙に列挙する習慣があります。)


それでは、このソース・コード内のTODOと書かれている行、およ
びreturn文の行を書き換えて、ComboBoxModelOfDepartmentのソー
ス・コードを完成させましょう。

完成したソース・コードを下に再度提示します。

--------------------------------------------------------
package jp.co.flsi.lecture.ui.model;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import java.util.Vector;
import jp.co.flsi.lecture.entity.Department;

public class ComboBoxModelOfDepartment extends AbstractListModel implements
ComboBoxModel {
   private Vector departmentList;
   private String selection;

   public void setDepartmentList(Vector aDepartmentList) {
      departmentList = aDepartmentList;
   }

   public Vector getDepartmentList() {
      return departmentList;
   }

   public Object getSelectedItem() {
      return selection;
   }

   public void setSelectedItem(Object anItem) {
      selection = (String)anItem;
   }

   public Object getElementAt(int index) {
      return ((Department) getDepartmentList().elementAt(index)).getDepartmentName();
   }

   public int getSize() {
      return getDepartmentList().size();
   }

}
--------------------------------------------------------

ここで、エディター内のComboBoxModelOfDepartmentの文字列の
下に橙色のアンダーラインが表示されて、その行の左側に警告の
マーク(丸みがかった橙色の三角形の中に!がはいったマーク)
が表示されますが、これは無視してください。問題はありません。

とりあえずマークの上にマウス・ポインターを重ねると説明が出
ますが、これを解説するためには以前にも触れたように直列化
(serialization)の話をしなければならないので、あと回しに
します。
直列化については、後にJavaBeansの話をするときに説明いたします。

どうしても気になる人は、HumanResourceJFrameなどのVisualEditor
が自動生成したソース・コードの先頭あたりに
--------------------------------------------------------
private static final long serialVersionUID = 1L;
--------------------------------------------------------
というコードがありますので、それをコピーして貼り付けてみて
ください。警告マークが消えます。


では、続いてDbManagerクラスのソース・コードを入力していく
ことにしましょう。
このクラスはjp.co.flsi.lecture.dbというパッケージに入れる
ことにしていましたから、まずは、jp.co.flsi.lecture.dbパッ
ケージを作っておきましょう


┌───────────────────────────┐
     jp.co.flsi.lecture.dbパッケージの作成
└───────────────────────────┘

(1) パッケージ・エクスプローラーのJStudy1(プロジェクト)を
右クリックし、「新規」→「パッケージ」を選択します。

(2) 「新規Javaパッケージ」ウインドウで「ソース・フォルダー」
の欄に「JStudy1」がはいっていることを確認し、「名前」の欄に
「jp.co.flsi.lecture.db」と入力し、「終了」ボタンをクリック
します。

これで、JStudy1プロジェクトの下にjp.co.flsi.lecture.dbパッ
ケージが作られましたね。

次に、このパッケージの中にDbManagerクラスを作成しましょう。


┌───────────────────────────┐
     DbManagerクラスの作成
└───────────────────────────┘

(1) パッケージ・エクスプローラーにできたjp.co.flsi.lecture.db
(パッケージ)を右クリックし、「新規」→「クラス」を選択しま
す。

(2) 「新規Javaクラス」ウインドウで「ソース・フォルダー」の欄
に「JStudy1」がはいっていることを確認し、「パッケージ」の欄に
「jp.co.flsi.lecture.db」がはいっていることを確認し、
「名前」の欄に「DbManager」と入力します。

(3) 「終了」ボタンをクリックします。

そうすると、DbManagerのエディターが開きますので、DbManagerの
ソース・コード(下に再度提示します)を完成させましょう。

--------------------------------------------------------
package jp.co.flsi.lecture.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbManager {
   protected static Connection conn = null;
   protected String driver = "org.h2.Driver";
   protected String url = "jdbc:h2:tcp://localhost:9092/test";
   protected String dbUser = "sa";
   protected String dbPassword = "";

   protected void connect() throws java.sql.SQLException {
      try {
         if(conn == null || conn.isClosed()) {
            Class.forName(driver);
            conn = DriverManager.getConnection
                        (url, dbUser, dbPassword);
            conn.setAutoCommit(false);
         }
      } catch(ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }

   protected void disconnect() {
      try {
         conn.close();
      } catch(SQLException ex) {
         ex.printStackTrace();
      }
   }

}
--------------------------------------------------------


次に、同じパッケージの中にDepartmentDbManagerクラスを作成
しましょう。


┌───────────────────────────┐
     DepartmentDbManagerクラスの作成
└───────────────────────────┘

(1) パッケージ・エクスプローラーにできたjp.co.flsi.lecture.db
(パッケージ)を右クリックし、「新規」→「クラス」を選択します。

(2) 「新規Javaクラス」ウインドウで「ソース・フォルダー」の欄
に「JStudy1」がはいっていることを確認し、「パッケージ」の欄
に「jp.co.flsi.lecture.db」がはいっていることを確認し、
「名前」の欄に「DepartmentDbManager」と入力します。

(3) 「終了」ボタンをクリックします。

そうすると、DepartmentDbManagerのエディターが開きますので、
DepartmentDbManagerのソース・コード(下に再度提示します)を
完成させましょう。

--------------------------------------------------------
package jp.co.flsi.lecture.db;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import jp.co.flsi.lecture.entity.Department;

public class DepartmentDbManager extends DbManager {
   private Vector departmentList = new Vector();

   public Vector getDepartmentList() {
      return departmentList;
   }

   public void getAllData() {
      {
         try {
            connect();
            Statement selectSql = conn.createStatement();
            ResultSet rs = selectSql.executeQuery("SELECT * FROM DEPARTMENT");
            while (rs.next()) {
               Department aDepartment = new Department();
               aDepartment.setDepartmentNumber(rs.getInt("DEPART_NUM"));
               aDepartment.setDepartmentName(rs.getString("DEPART_NAME"));
               aDepartment.setLocation(rs.getString("LOCATION"));
               getDepartmentList().addElement(aDepartment);
            }
            selectSql.close();
            disconnect();
         }
         catch (SQLException exception) {
            exception.printStackTrace();
         }
      }
   }
  
}
--------------------------------------------------------


最後に、jp.co.flsi.lecture.uiパッケージの中の編集です。
HumanResourceEntryPaneのソース・コードの中の以下の部分
--------------------------------------------------------
private JComboBox getJComboBox1() {
   if (jComboBox1 == null) {
      jComboBox1 = new JComboBox();
   }
   return jComboBox1;
}
--------------------------------------------------------

を次のように編集しましょう。
--------------------------------------------------------
private JComboBox getJComboBox1() {
   if (jComboBox1 == null) {
      DepartmentDbManager aDbm = new DepartmentDbManager();
      aDbm.getAllData();
      ComboBoxModelOfDepartment model = new ComboBoxModelOfDepartment();
      model.setDepartmentList(aDbm.getDepartmentList());
      jComboBox1 = new JComboBox(model);
      jComboBox1.setSelectedIndex(0);
   }
   return jComboBox1;
}
--------------------------------------------------------

なお、上記のソース・コードにはimport文を書いてありませんから、
コピー&ペーストで上のコードをそのまま貼り付けたりすると、
DepartmentDbManagerやComboBoxModelOfDepartmentにエラーのマー
ク(赤いアンダーライン)がつくはずです。

必要なimport文を挿入させるためにコンテンツ・アシストの機能を
使用(たとえば、DepartmentDbManagerと入力してCtrlキーを押し
ながらスペース・キーを押す)してください。

VEエディターの画像上で、JComboBoxに警告のマーク(橙色の逆三角形
の中に!のマーク)が表示されることと思いますが、これはソース・
コード内に0番目のインデックスの要素が書かれていないのに
jComboBox1.setSelectedIndex(0)でインデックス0を指定しているから
です。

VEエディターはデータベースの中身まで調べることができませんので、
ソース・コードだけチェックしてこのような警告を出しますが、とり
あえず無視しましょう。


┌───────────────────────────┐
     動作確認
└───────────────────────────┘

(1) 入力/編集したソース・コードをすべて保管(Ctrl + S)して
ください。

(2) H2 Consoleを立ち上げるなどしてH2 Database EngineのRDBMSを
起動してください。
(もし、JDBCドライバーをまだEclipseのクラスパスに登録していな
い人は、ここでvol.037を参照して登録しておいてください。)

(3) HumanResourceJFrameを実行してください。

(4) 「所属部署」のJComboBoxの右側の逆三角形ボタンをクリック
して(このとき表示されるリストをドロップダウン・リストという)、
「社長直属」、「総務課」、「営業課」がリストされていることを
確認してください。
また、そのうちの一つを選択すると、ドロップダウン・リストが閉じ
て、選択した項目が表示されることを確認してください。

(5) HumanResourceJFrameのウインドウは閉じるボタン(×マークの
ボタン)をクリックして閉じましょう。



では、さらにアプリケーションの開発を続けていきましょう。

HumanResourceEntryPaneの新規登録の画面には、あと登録作業のため
のボタンを付けて、ボタンをクリックすると、入力されたデータを
データベースのEMPLOYEEテーブルに書き込むように、プログラミング
する必要があります。

このため、ボタンがクリックされたときに必要な操作を行うように、
以前(vol010などで)お話したActionListenerのactionPerformed()
メソッドを実装しますが、また次回からのお話にします。



では、また来週。



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