第5回 HSQLDBプラグインを動かしてみよう


萩原 巧
リトルソフト株式会社
2006/11/18




 前回では画面の見た目を作成したので、今回は作成した画面同士を結び付ける作業とともに、起動するデータベース情報の保存や読み込みのロジックを作成していきます。

HSQLDB情報画面の処理実装の概要

 Eclipse設定画面から、HSQLDB情報画面を表示できるようになった田中君。続いてHSQLDB情報画面内のロジック構築を始める。

長尾君 「Eclipse設定画面からHSQLDB情報画面が表示できるようになったけど、HSQLDB情報画面には何も処理を書いていないよね。ここからは、HSQLDB情報画面で必要になる処理を記述していこう」

HSQLDB設定画面

 まず、追加ボタンに関する処理(1)。次に、追加された情報を[HSQLDB設定画面]に反映させる処理(2)。そして、削除ボタンに関する処理(3)を実装したら最後に、更新した情報をEclipseに保存する処理(4)について順番に解説します。

新規追加ダイアログの作成

HSQLDB新規追加ダイアログ

長尾君 「まずは、HSQLDB新規追加ダイアログを作成しよう」
田中君 「HSQLDB新規追加ダイアログ画面の見た目部分については以前(連載4回目)作成したよね(HSQLAddDefinitionCompositeクラス)。そのクラスとこれから作るダイアログを結び付けるのかな?」
長尾君 「田中君、大正解だよ。そのとおり、ダイアログを継承したクラスを新規作成して、HSQLAddDefinitionCompositeクラスと結び付けるんだ。早速進めてみよう」

 ダイアログのクラスは、通常のJavaクラスと同じように作成できます。以下のように設定してください。

項目名称 内容
パッケージ hsqldb.dlgs]と設定してください
名前(クラス名) HSQLAddDefinitionDialog]と設定してください
スーパークラス org.eclipse.jface.dialogs.Dialog]と設定してください

コラム org.eclipse.jface.dialogs.Dialogとは
いわゆるモーダルダイアログを、Eclipseプラグイン内で容易に使用するために、あらかじめ用意されたクラスです。このクラスは、jfaceと呼ばれるSWTを使用して実装されるUIツールキットに含まれており、比較的容易に各種機能を使用できます。 jfaceについて詳しくは、Eclipseのオンラインヘルプの[Platformプラグイン・デベロッパー・ガイド]―[参照]―[JFace UI フレームワーク]をご覧ください。

 クラス(HSQLAddDefinitionDialog)のソースは以下のとおりに記述してください。

HSQLAddDefinitionDialog クラス
public class HSQLAddDefinitionDialog extends Dialog{

    private String title = "";
    private String dbName = "";
    private String dbPath = "";
    private String dbPort = "";
    private HSQLAddDefinitionComposite comp;

    public HSQLAddDefinitionDialog(Shell parent
                                    , String title) { //(1)
        super(parent);
        this.title = title;
    }

    protected void configureShell(Shell newShell) {   //(2)
        super.configureShell(newShell);
        newShell.setText(title);
    }

    protected Point getInitialSize() {                //(3)
        return new Point(390,200);
    }

    protected Control createDialogArea(
                                   Composite parent) {//(4)
        super.createDialogArea(parent);
        comp = new HSQLAddDefinitionComposite(parent,0);
        return comp;
    }

    public String getDBName() {                       //(5)
        return dbName;
    }

    public String getDBPath() {
        return dbPath;
    }

    public String getDBPort() {
        return dbPort;
    }

    protected void buttonPressed(int buttonId) {      //(6)
        if (buttonId == IDialogConstants.OK_ID) {
            dbName = comp.getDBName();
            dbPath = comp.getDBPath();
            dbPort = comp.getDBPort();
        }
        super.buttonPressed(buttonId);
    }
}

 (1):コンストラクタでは、第2引数にこのダイアログのタイトル文字列を設定して、それを受け取れるようにします。

 (2):configureShellメソッドをオーバーライドして、コンストラクタで取得したタイトル文字列をShell#setTextメソッドにてタイトルに設定します。

 (3):getInitialSizeメソッドをオーバーライドして、ダイアログのサイズを設定します。この場合、390ピクセル*200ピクセルの大きさに設定しています。

 (4):重要なメソッドです。createDialogAreaメソッドをオーバーライドして、ユーザーインターフェイスクラスHSQLAddDefinitionCompositeのインスタンス化を行い、そのインスタンスを返却します。この処理で、先に作成したHSQLDB新規追加ダイアログ画面の見た目とダイアログの結び付けを行います。

 (5):それぞれの入力項目に対応するゲッターメソッドを作成します。これらの値はbuttonPressedメソッド(6)内にてユーザーインターフェイスクラスHSQLAddDefinitionComposite から取得できます。

 (6):こちらも重要なメソッドです。buttonPressedをオーバーライドして、ダイアログの[OK]、[キャンセル]ボタンがクリックされたときの処理を記述します。引数のbuttonId がIDialogConstants.OK_ID(OKボタンがクリックされたことを示す)ならば、HSQLAddDefinitionCompositeクラスのゲッターメソッドを実行して、入力項目の値を取得します。

田中君 「うっ、いきなりソースがたくさんある……」
長尾君 「確かにいきなりソースを出して説明しちゃったね。ここでは、すべてのクラスやメソッドについて丁寧に説明することはとてもできないけど、ソース内に定義されているメソッドを1つ1つ区切って解読を進めていけば、イメージはわいてくると思うよ。分からないクラスや疑問に思った点はEclipseのヘルプを見たり、ネットの検索を活用してできる限り解決できるようにしよう」
田中君 「はい、頑張ります」
長尾君 「さて、これでダイアログの第1段階は終了したよ。続いてはこのダイアログを、HSQLDB設定画面の[追加]ボタン(1)がクリックされたら表示されるようにしよう。俗にいう『イベント処理』の実装だ」

追加ボタンのクリックイベントの実装とダイアログの表示

長尾君 「HSQLPreferencePageCompositeクラスを開いて、[追加]ボタンを選択したら右クリックして表示されるメニューから[Events]―[widgetSelected]を選択すると、ソースが自動生成されるよ」

widgetSelectedを選択

自動生成されたソース
buttonAdd.addSelectionListener(//無名インナーアダプタクラス
    new org.eclipse.swt.events.SelectionAdapter() {
        public void widgetSelected(
        org.eclipse.swt.events.SelectionEvent e) {
            // TODO Auto-generated Event stub widgetSelected()
            System.out.println("widgetSelected()");
        }
    }
);

田中君 「これはどんな意味なの?」
長尾君 「ボタンが選択(クリックやキーボード押下)されたときに実行する動作を記述しているんだ」
田中君 「あまり見ないソースの書き方だね」
長尾君 「これは無名インナークラスとアダプタクラスを併用しているから、このようなちょっと難しい見た目になるんだ。ところで田中君、無名内部クラスやアダプタクラスって知っている?」
田中君 「……、知りません。……」

コラム 無名インナークラス(無名内部クラス)とは
 無名インナークラスとは、インナークラスをさらに簡略化し、文字通り名前を持たない(無名)インナークラスです。 インスタンス化する際に同時にクラスの宣言を行うので、簡単なクラスを作る場合に使用するのが一般的です。

コラム アダプタクラスとは
アダプタクラスとは、使用するさまざまなインターフェイスをあらかじめ実装しているクラスです。Javaでは、SwingをはじめとするJavaGUIアプリケーション開発において、イベントリスナーに登録する際に頻繁に使用します。

長尾君 「イベントの作成ができたら、ダイアログを表示させよう」

addDefinitionData()メソッドの追加
buttonAdd.addSelectionListener(
    new org.eclipse.swt.events.SelectionAdapter() {
        public void widgetSelected(
        org.eclipse.swt.events.SelectionEvent e) {
            addDefinitionData();
        }
    }
);

//… 略 …

private void addDefinitionData(){

    // HSQLAddDefinitionDialogクラスをインスタンス化
    final HSQLAddDefinitionDialog dlg
    = new HSQLAddDefinitionDialog(
        new Shell(),"HSQLDB 新規追加ダイアログ");

    //ダイアログを表示させる
    dlg.open() ;
}

長尾君 「[widgetSelected]メソッド内で[addDefinitionData]メソッドを呼び出すように修正して、続いて、[addDefinitionData]の実装をしよう。[addDefinitionData]メソッドでは、HSQLAddDefinitionDialogをインスタンス化して、openメソッドを実行することによって、ダイアログが表示される処理を行っているんだ」
田中君 「これだけで表示されるの?」
長尾君

「表示されるよ。ここまででいったん動作確認をしてみよう」


HSQLDB設定画面の[追加]ボタンをクリックすると、HSQLDB新規追加ダイアログが表示される

長尾君 「だんだんアプリケーションらしくなってきたね。ところで、[HSQLDB新規追加ダイアログ]の[OK]、[キャンセル]ボタンって田中君が作成したんだっけ?」
田中君 「違うよ。ダイアログを表示させたら自動的に作成されていたよ」
長尾君

「[OK]、[キャンセル]ボタンは自動的に作成されるんだ。さらにそれだけではなく、OK、キャンセルに伴う動作もあらかじめ作成されるんだ。実際のソースを見ながら確認しよう」


addDefinitionData メソッドの書き換え
private void addDefinitionData(){

    final HSQLAddDefinitionDialog dlg
    = new HSQLAddDefinitionDialog(
        new Shell(),"HSQLDB 新規追加ダイアログ");

    if (dlg.open() == Dialog.OK){
        System.out.println("OKがクリックされた");
    }else if (dlg.open() == Dialog.CANCEL){
        System.out.println("キャンセルがクリックされた");
    } else{
        System.out.println(
            "閉じる(×)ボタンがクリックされた");
    }
}

長尾君 「先ほど作成した[addDefinitionData]メソッドを上記のように書き換えることによって、ダイアログの結果[OK]、[キャンセル]に応じた処理を記述できるんだ」
田中君 「ダイアログから受け取った結果を戻り値として、それを判断しているんだね」
長尾君

「そうだよ。ちなみに、このような考え方はEclipseのPlugin(JFace)プログラミング固有のものではなく、例えば、SwingDelphiVisual BasicなどのGUIプログラミングにもよく見られるんだ」


1/3

Index
第5回 HSQLDBプラグインを動かしてみよう
Page1
HSQLDB情報画面の処理実装の概要
新規追加ダイアログの作成
追加ボタンのクリックイベントの実装とダイアログの表示
  Page2
追加した情報を反映
削除ボタンの処理を実装
  Page3
入力情報をEclipseに保存
今回の実装の動作確認と最終回予告



Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間