< 前へ | 次へ >

演習 2.6: 新規の従業員追加用のアクションとバインディングをセットアップする

この演習では、My Company Directory アプリケーションで、 新規従業員レコードを追加できるようにします。

新規従業員を追加する場合、アプリケーションの動作はより複雑かつダイナミックであるため、この演習は本質的に少し複雑であり、 ユーザーはソース・コードの一部を手操作で変更する必要があります。 さらに、この演習では、データ・オブジェクトの高度な機能の一部を示して、 必要に応じてバインダーおよびデータ・オブジェクトおよびバインダーを使用できる方法の創造的な例を紹介します。

以下の項目は、アプリケーションで必須の動作の説明です。

  • New」ボタンをクリックしたときに、次の動作が発生します。
    • 従業員テーブルの選択が解除され、テーブルが使用不可になる。
    • テーブル選択をクリアすると、「Delete」ボタンが使用不可になる。
    • Filter」フィールドが使用不可になる。
    • 新規従業員 ID を除いて、詳細フィールドのすべての値が消去される。
    • Update」ボタンのテキストが「Add」に変わる。
  • Add」ボタンをクリックしたときに、次の動作が発生します。
    • 詳細フィールドに入力した値は、新規従業員レコードとして登録簿に追加される。
    • テーブルが使用可能になり、値が更新される。
    • Filter」フィールドが使用可能になる。
    • Add」ボタンのテキストが「Update」に戻る。

createNewFullEmployeeRecord() を呼び出す新規データ・ソース・データ・オブジェクトを追加する。

サンプル Web サービスは、次に利用可能な従業員 ID 番号を持つ、 新しい空の従業員レコードを提供する createNewFullEmployeeRecord サービスを 提供します。 この空のレコードは、新しい従業員の情報を取り込んで、Web サービスに 再度サブミットされます。

  1. Java ビジュアル・エディターのパレット上で、データ・オブジェクト・ドロワーを展開して、 「データ・ソース・データ・オブジェクト」を選択する。
  2. デザイン・ビューまたはフリー・フォーム域にマウス・ポインターを移動して、 左クリックし、データ・ソース・データ・オブジェクトをドロップする。 新規データ・ソース・データ・オブジェクトが追加されて、フリー・フォーム域に表示されます。

    フリー・フォームのデータ・ソース・データ・オブジェクト (未構成)

  3. データ・ソース・ データ・オブジェクトを右クリックして、 「フィールド名の変更」を選択する。 データ・オブジェクトの名前を newEmployeeRecord に変更します。
  4. newEmployeeRecord データ・オブジェクトを右クリックして、 「バインディング・プロパティー」を選択する。 「データ・バインディング」ダイアログ・ボックスが開きます。
  5. データ・ソース」フィールドで、「webServiceDataSource」を選択する。
  6. サービス」フィールドで、「createNewFullEmployeeRecord」を選択する。
  7. OK」をクリックする。
フリー・フォーム域で、newEmployeeRecord データ・ソース・データ・オブジェクトが Web サービスにバインドされるのを見ることができます。

webServiceDataSource に接続された newEmployeeRecord データ・オブジェクト

データ・オブジェクトの切り替えを容易にするために基本データ・オブジェクトを追加する。

詳細フィールドおよび「Update」ボタンは、(新規従業員の更新および作成の両方の実行のため) モードを切り替える必要があるため、 これらはそれぞれ異なる時点で 2 つの異なるデータ・オブジェクトにバインドされる必要があります。 このステップを容易にするために、ユーザーは switchingDataObject という名前の基本データ・オブジェクトを追加します。 この基本データ・オブジェクトを使用して、 テキスト・フィールドのバインディングを selectedEmployeeRecord と newEmployeeRecord との間で切り替えます。

新規基本データ・オブジェクトは、 単に、以前の演習でユーザーが定義した別のデータ・オブジェクト (selectedEmployeeRecord) を指すだけです。 この新しいデータ・オブジェクトは、この課題の始めに作成した newEmployeeRecord を 使用するよう、この基本データ・オブジェクトに指示するメソッドを作成すると、 役立つようになります。 すなわち、この基本データ・オブジェクトは、中間データ・オブジェクトとして機能します。 この中間データ・オブジェクトは selectedEmployeeRecord データ・オブジェクトと newEmployeeRecord データ・オブジェクトとの間で切り替えを行い、 対象のアプリケーション内のビジュアル・コンポーネントが 2 つの異なるデータ・オブジェクトと連動することを可能にします。
  1. ビジュアル・エディターのパレット上で、 「基本データ・オブジェクト」を選択し、フリー・フォーム域にドロップする。 basicDataObject が追加されます。

    フリー・フォーム上の基本データ・オブジェクト (未構成)

  2. データ・オブジェクトを switchingDataObject に名前変更する。
  3. switchingDataObject の「プロパティー」ビューで、 sourceObject プロパティーを selectedEmployeeRecord に設定する。 selectedEmployeeRecord は、プロパティーの「Value」列のドロップダウン・メニューから選択できます。

    これで switchingDataObject は、selectedEmployeeRecord を参照し、 同じ値を反映するようになります。

    selectedEmployeeRecord データ・オブジェクトに接続されたフリー・フォーム上の switchingDataObject

それぞれの従業員フィールドを switchingDataObject に再バインドする。

各従業員詳細フィールドが既に selectedEmployeeRecord にバインドされていても、 ここでは、それらを switchingDataObject にバインドします。 これらのフィールドをバインドしたならば、既存の従業員レコードを変更する場合か、 または新規従業員レコードを追加するかによって、 テキスト・フィールドのデータ・オブジェクト間を動的に切り替えることができます。

従業員詳細セクションのそれぞれのフィールドについて、次の手順を完了します。
  1. フィールドを選択して、「バインド」タブをクリックする。
  2. 「フィールド・データのバインディング」ダイアログ・ボックスで、switchingDataObject を選択する。 これらのフィールドは selectedEmployeeRecord に以前バインドされています。

    switchingDataObject 上の「lastName」プロパティーにバインドされた「lastNameField」フィールドを表示する「フィールド・データのバインディング」ダイアログ・ボックス

  3. フィールドが正しいデータ・オブジェクト・プロパティーにまだバインドされていることを確認して、 「OK」をクリックする。 デザイン・ビューでこのフィールドを選択すると、 これで、バインダーの線が switchingDataObject を指しているのを見ることができます。

    switchingDataObject にバインドされている詳細フィールド

モードの更新および切り替えのフラグおよびメソッドを定義する。

次の updateMode() メソッドは、モード・フラグが「新規」に設定されているかどうか調べるために検査して、 状況に応じて、それに従ってアプリケーションの動作を変更します。 デフォルトでは、Boolean のフラグの isNewMode は「false」に設定されています。 また updateMode() メソッドは、従業員テーブルと「Filter」フィールドを使用可能にし、 「Update」ボタンのテキストを「Update」に設定します。 isNewMode を「true」に設定すると、従業員テーブルは使用不可になり、 選択項目があると解除され、「Filter」フィールドは使用不可になり、 「Update」ボタンのテキストは「Add」に設定されます。

DirectoryApp.java クラスに、次のコードを最後の閉じ中括弧の直前に追加します。
private boolean isNewMode = false;
private void updateMode() {
   if (isNewMode) {
      getEmployeesTable().clearSelection();
      getEmployeesTable().setEnabled(false);
      getFilterField().setEditable(false);
      getUpdateCreateButton().setText("Add");
   } else {
      getEmployeesTable().setEnabled(true);
      getFilterField().setEditable(true);
      getUpdateCreateButton().setText("Update");
   }
}

actionPerformed イベントを「New」ボタンに追加する。

このステップでは、「New」ボタンがクリックされたときのイベント・コードを追加します。 イベントは、switchingDataObject に対して newEmployeeRecord データ・オブジェクトを使用するように指示を出し、 モード・フラグを「新規」に設定して、直前のステップでユーザーが追加した updateMode() メソッドを実行します。

  1. デザイン・ビューで、「New」ボタンを右クリックし、 「イベ ント」 > 「actionPerformed」」と選択する。 getNewButton() メソッド内に、次のコードが生成されます。
    newButton.addActionListener(new java.awt.event.ActionListener() {
       public void actionPerformed(java.awt.event.ActionEvent e) {
          System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
       }
    });
  2. 生成されたこのスタブを次のコードで置き換える。
    newButton.addActionListener(new java.awt.event.ActionListener() {
       public void actionPerformed(java.awt.event.ActionEvent e) {
          getSwitchingDataObject().setSourceObject(getNewEmployeeRecord());
          getNewEmployeeRecord().refresh();
          isNewMode = true; //sets application to new mode
          updateMode(); //changes UI according to new mode
          getLastNameField().grabFocus();
       }
    });

「Update」ボタンを再バインドする。

直前の課題では、modifyEmployee メソッドを Web サービスで使用するために、 「Update」ボタンをプログラムしました。 そのアクションは、SwingDataServiceAction としてインプリメントされています。 SwingDataServiceAction のプロパティーの 1 つにソース・オブジェクトがあります。 これは、サービスの引数としての役割を果たします。 変更アクションのソース・オブジェクトは、現在、selectedEmployeeRecord に設定されています。 更新と追加の両方を制御するようにボタンをプログラムするためには、 switchingDataObject を modifyEmployee サービスの引数として使用するようにボタンのアクションを再構成します。

  1. デザイン・ビューで、「Update」ボタンを選択する。 ピンクの点線の矢印は、selectedEmployeeRecord がサービス呼び出しの引数であることを示していることに注目してください。
  2. Update」ボタン上にある「バインド」タブをクリックする。
  3. 引数」フィールドで、switchingDataObject を選択する。

    switchingDataObject を使用している「Update」ボタンのコンポーネント・アクション・バインディング

  4. OK」をクリックする。

    これで、ボタンのアクションは、switchingDataObject を、modifyEmployee メソッドに対する 引数として使用するように構成されていることに注目してください。

    引数としての switchingDataObject を持つ Web サービスにバインドされた「Update」ボタン

モードをリセットするためにイベントを「Update」ボタンのバインダーに追加する

Update」ボタンをクリックして、Web サービス上のアクションが完了した後で、 アプリケーションをデフォルトのモードおよびボタン動作に戻したい場合があります。 これを行うには、更新および追加が実行された後にモードを更新し、テーブルを最新表示するアクション・バインダー上のイベント・リスナーを追加します。

次のコードを、「Update」ボタンの getModifyEmployeeAction() メソッドに追加する。
modifyEmployeeAction.addActionBinderListener(
  new jve.generated.IActionBinder.ActionBinderListener() {
    public void afterActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {
      if (isNewMode) {
        //Go back to using the selectedEmployeeRecord
        getSwitchingDataObject().setSourceObject(getSelectedEmployeeRecord());
        //Revert out of new mode
        isNewMode = false;
        updateMode();
      }
      // Refresh the table's data object
      getLightEmployeeRecordRows().refresh();
    }
    public void beforeActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {}
});

演習のチェックポイント

これで、My Company Directory アプリケーションを実行したときに、 「New」ボタンをクリックして、 新規従業員レコードを追加できるようになりました。

< 前へ | 次へ >