TOP設計・移行・活用> STEP2:セルの編集
Eclipse実践プラグイン開発
Eclipse実践プラグイン開発

第4回:JFaceのGUIコンポーネント
著者:ビーブレイクシステムズ  大森 洋行   2005/7/25
前のページ  1  2   3  4  次のページ
STEP2:セルの編集

   次に、表示している各データをテーブル上で編集できるように変更します。

   出席番号、各教科の点数、氏名は文字列、評価はコンボボックスで"A 〜 E"の5段階評価から選択するようにします。

   テーブル上でデータの編集を可能にするには、テーブルに対してセルエディタを設定する必要があります。セルエディタは、編集するデータの型によって使用するクラスが異なります。
セルエディタ データの型 備考
CheckboxCellEditor Boolean CheckboxCellEditorでは真/偽を保持するのみでチェックボックスのイメージは提供しません。チェックボックスのイメージを表示したい場合はあらかじめ画像ファイルを用意し、ラベルプロバイダでイメージを返すように実装します
ComboBoxCellEditor Integer コンボボックスによるデータの編集を行うエディタ。インデックスをあらわすIntegerを扱います
ColorCellEditor RGB RGBのカラーデータを扱うエディタ。DialogCellEditorのサブクラス
TextCellEditor String 文字列を扱うエディタ
DialogCellEditor Object 任意のデータを扱うエディタ。独自のエディタを利用する場合はこのクラスを継承

表1:セルエディタ一覧

   まずは、テーブルビューアの各カラムに対応するセルエディタを設定します。プロパティは後ほど登場するセルモディファイヤの部分において出てきますので、ここではこういうものだと思って先に進んでください。

⁄⁄ カラムを識別するためのプロパティ
String[] properties = new String[] {
   "id", "name", "english_score", "japanese_score", "mathematics_score"
};

⁄⁄ プロパティの設定
testResultViewer.setColumnProperties(properties);

⁄⁄ ComboBoxCelEditorに表示するアイテム
String[] evaluationItems = new String[] {
   "A", "B", "C", "D", "E"
};

⁄⁄ セルエディタの生成
CellEditor[] cellEditors = new CellEditor[]{
   new TextCellEditor(testResultTable),
   new TextCellEditor(testResultTable),
   new TextCellEditor(testResultTable),
   new TextCellEditor(testResultTable),
   new TextCellEditor(testResultTable),
   new ComboBoxCellEditor(testResultTable, evaluationItems)
};

⁄⁄ セルエディタの設定
testResultViewer.setCellEditors(cellEditors);

   ここまででテーブルビューアに対するセルエディタの設定は完了ですが、データとセルエディタが関連付いていないので、現時点ではセルの編集はできません。編集可能にするには、データとセルエディタを関連付けるためにセルモディファイヤと呼ばれるクラスが必要になります。



package table_viewer;

import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.TableItem;

⁄**
 * データとセルエディタを関連付けるためのクラス
 *⁄
public class TestResultCellModifier implements ICellModifier {

   private TableViewer viewer_;

   private String[] evaluationItems_;

   public TestResultCellModifier(TableViewer viewer, String[] evaluationItems) {
     viewer_ = viewer;
     evaluationItems_ = evaluationItems;
   }

   ⁄**
    * 編集可能かどうかを返すメソッド
    * @return true=編集可能、false=編集不可
    *⁄
    public boolean canModify(Object element, String property) {
      return true;
    }

   ⁄**
    * エディタに表示するデータを返す
    * @param element 選択された行に対応するデータ
    * @param property 選択されたカラムのプロパティ
    * @return 表示する値
    *⁄
    public Object getValue(Object element, String property) {
      TestResult testResult = (TestResult)element;
      Object result = null;

      ⁄⁄ プロパティに応じて返す値を設定する
      ⁄⁄ プロパティはtestResultViewer.setColumnProperties(properties);で設定したものに対応する
      if (property.equals("id")) {
          result = String.valueOf(testResult.getId());
      } else if (property.equals("name")) {
          result = testResult.getName();
      } else if (property.equals("english_score")) {
          result = String.valueOf(testResult.getEnglishScore());
      } else if (property.equals("japanese_score")) {
          result = String.valueOf(testResult.getJapaneseScore());

      } else if (property.equals("mathematics_score")) {
          result = String.valueOf(testResult.getMathematicsScore());       } else if (property.equals("evaluation")) {
          ⁄⁄ コンボボックスの場合はインデックスを返す
          for (int cnt = 0; cnt < evaluationItems_.length; cnt++){
              String evaluationItem = evaluationItems_[cnt];
              if (evaluationItem.equals(testResult.getEvaluation())) {
                  result = new Integer(cnt);
                  break;
              }
          }
      }
      return result;
    }

    ⁄**
     * エディタの変更の通知を受ける
     *
     * @param element
     * @param property
     * @param value
     *⁄
    public void modify(Object element, String property, Object value) {
      TableItem tableItem = (TableItem)element;
      TestResult testResult = (TestResult)tableItem.getData();

      ⁄⁄ プロパティに応じて返す値を設定する
      ⁄⁄ プロパティはtestResultViewer.setColumnProperties(properties);で設定したものに対応する
      if (property.equals("id")) {
          try {
              testResult.setId(Integer.valueOf( (String)value).intValue());
          } catch(NumberFormatException numEx) {
              ⁄⁄ 数値でない場合
          }
      } else if (property.equals("name")) {
          testResult.setName( (String)value);
      } else if (property.equals("english_score")) {
          try {
              testResult.setEnglishScore(Integer.valueOf( (String)value).intValue());
          } catch(NumberFormatException numEx) {
              ⁄⁄ 数値でない場合
          }
      } else if (property.equals("japanese_score")) {
          try {
              testResult.setJapaneseScore(Integer.valueOf( (String)value).intValue());
          } catch(NumberFormatException numEx) {
              ⁄⁄ 数値でない場合
          }
      } else if (property.equals("mathematics_score")) {
          try {
              testResult.setMathematicsScore(Integer.valueOf( (String)value).intValue());
          } catch(NumberFormatException numEx) {
              ⁄⁄ 数値でない場合

          }
      } else if (property.equals("evaluation")) {
          ⁄⁄ コンボボックスの場合はインデックスを返す
          String evaluation = evaluationItems_[((Integer)value).intValue()];
          testResult.setEvaluation(evaluation);
      }
      ⁄⁄ テーブルビューアを更新
      viewer.update(testResult, null);
    }
}

   次に、作成したセルモディファイヤをテーブルビューアに設定します。

⁄⁄ セルモディファイヤの設定
testResultViewer.setCellModifier(new TestResultCellModifier(testResultViewer, evaluationItems));

   以上で、セルの編集ができるようになります。

STEP2の実行結果
図2:STEP2の実行結果

STEP2のソースコード
Text  step2.zip
  (ZIPファイル/4.49KB)
前のページ  1  2   3  4  次のページ


ビーブレイクシステムズ社 大森 洋行
著者プロフィール
ビーブレイクシステムズ社  大森 洋行
中堅システム開発会社にて、データベース検索ソフトの開発・導入コンサルティング・セミナー講師に従事。その現場の中で、Java及びオープンソースを用いたシステム開発は今後のシステム開発の主流になると考え、それらを独学で学ぶ。本格的にそれらを用いた開発に携わるため、ビーブレイクシステムズに入社。現在、データ項目やその流れの分析に重点をおきながら、Javaやオープンソースを用いたシステム開発に携わる。


INDEX
第4回:JFaceのGUIコンポーネント
  はじめに
STEP2:セルの編集
  STEP3:選択したセルの編集
  リスナークラスを作成しカラムに追加