« TableViewerのデータ供給・表示の仕組み | トップページ | TableViewer向けLabelProviderの作成 »

2004.04.18

TableViewer向けContentProviderの作成

TableViewerを使うにあたって必要となる3つの機構を「TableViewerのデータ供給・表示の仕組み」で解説した。今回はその中の1つ,ContentProviderを取り上げる。ContentProviderを準備すれば,とりあえずTableViewerが動くようになる。

TableViewerでは,ContentProviderはIStructuredContentProviderインタフェースの実装クラスとして作成する。ここでは,「TableViewerのデータ供給・表示の仕組み」で例として紹介したEmployeeオブジェクトのListコレクションをドメインオブジェクトとした際にContentProviderをどのように作成するかを示す。

  public class EmployeeContentProvider
      implements IStructuredContentProvider {
    public Object[] getElements(Object inputElement) {
      return ((List)inputElement).toArray();
    }
    public void dispose() {
    }
    public void inputChanged(Viewer viewer,
        Object oldInput, Object newInput) {
    }
  }

TableViewerクラスのsetInputメソッドで渡されたドメインオブジェクトは,IStructureContentProviderインタフェースの実装クラスで規定されたgetElementsメソッドに渡される。getElementsメソッドでは,引数で渡されたドメインオブジェクトを元に,1行分の情報を持つオブジェクトの配列を生成して返却する。上記では,Employeeオブジェクトが格納されたListオブジェクトが引数に渡されてくるという前提のもとに,引数をList型にキャストし,そのtoArrayメソッドを呼び出してコレクション内のオブジェクトを配列に変換し,それを返却している。つまり,Employeeオブジェクトの配列を返却している。

disposeメソッドは,TableViewerが破棄された時に呼び出されるメソッドで,ContentProvider内で何らかの後始末的処理を記述する場所である。上記の例では後始末は必要ないので,何も処理を記述していない。

inputChangedメソッドは,TableViewerオブジェクトのsetInputメソッドでドメインオブジェクトが渡されたときに呼び出されるメソッドである。既にsetInputメソッドでドメインオブジェクトがセットされていた場合,再度setInputメソッドで新しいドメインオブジェクトがセットされると,inputChangedメソッドの呼び出し時に引数としてoldInputに既にセットされていたドメインオブジェクト,newInputに新しいドメインオブジェクトが渡されてくる。第1引数のTableViewerオブジェクトをContentProviderインスタンス内に保持しておく使用方法なども考えられるが,getElementsメソッドさえしっかり実装しておけば通常は問題ない。

上記のようにIStructuredContentProviderインタフェースの実装クラスができあがったところで,早速それをTableViewerオブジェクトにセットする。手順は以下のような感じ。setContentProviderメソッドの引数の型はIContentProviderインタフェースだが,TableViewerクラス(の親クラスのStructuredViewerクラス)ではIStructuredViewerオブジェクトかどうかがチェックされている。

  List employeeList = ...; // ドメインオブジェクト作成
  TableViewer viewer = ...; // TableViewerオブジェクト作成
  // ヘッダ列の作成
  viewer.setContentProvider(new EmployeeContentProvider());
  viewer.setInput(employeeList);

ここまでのコードで実行したときのスナップショットを以下に示しておく。

tableviewer-test-view-contentprovider.gif

ご期待通り(?),名前と年齢は表示されず,Employeeオブジェクトのハッシュコードが最初(名前)の列に表示されてしまった。正しく表示するためには,もう一つの機構,LabelProviderが必要である。

ちなみに,実は上記の例では,IStructuredContentProviderインタフェースの実装クラスを自作する必要はない。ドメインオブジェクトが「オブジェクトの配列」または「コレクション(java.util.Collectionオブジェクト)」の場合,Eclipseプラットフォームが提供してくれているArrayContentProviderクラスを利用することができる。ArrayContentProviderクラスでは,ドメインオブジェクト,すなわちgetElementsメソッドの引数としてオブジェクトの配列が渡された場合はそれをそのまま返却し,コレクションが渡された場合はtoArrayメソッドを使ってオブジェクトの配列に変換してそれを返却してくれる。ArrayContentProviderクラスで事足りる場合は,積極的に使ってよい。

|

« TableViewerのデータ供給・表示の仕組み | トップページ | TableViewer向けLabelProviderの作成 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/457839

この記事へのトラックバック一覧です: TableViewer向けContentProviderの作成:

« TableViewerのデータ供給・表示の仕組み | トップページ | TableViewer向けLabelProviderの作成 »