■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |