TableViewerのデータ供給・表示の仕組み
「TableViewerを使った表コンポーネントの利用」により,表コンポーネントをビュー上に出せるようになった。また,「TableViewerのヘッダ列の作成」により,表コンポーネントにヘッダ列(タイトル行)を作れるようになった。しかし,肝心のデータを表に表示することができていない。ここでは,TableViewerでのデータの供給や表示の仕組みについて紹介する。
まず,TableViewerに表示させたいデータを持つオブジェクトのことをドメインオブジェクトと呼ぶ。アプリケーション独自にドメインオブジェクトは設計されるが,基本的にドメインオブジェクトのクラスに対してTableViewer向けに手を加える必要はない。例えば,社員1人を表す以下のようなクラスがあって,何人分かの社員オブジェクトを持つコレクションがあったとする。
public class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
TableViewerには,そのドメインオブジェクトを何とそのまま突っ込んでOKである。TableViewerにドメインオブジェクトを渡すためにsetInputメソッドを使用するのだが,その引数の型はObjectである。最初社員0人でいいのであれば,viewer.setInput(new ArrayList()) でもOK。ここではListコレクションを渡しているが,Listでなければならないということはなく,自作のクラスだってかまわない。
List employeeList = new ArrayList();
employeeList.add(new Employee("よういちろう", 29));
employeeList.add(new Employee("ようこ", 25));
TableViewer viewer = ...;
viewer.setInput(employeeList);
さて,TableViewerが受け取ったドメインオブジェクトをどのように扱うかだが,もちろん独自のクラスのオブジェクトを渡されたって,TableViewerは困ってしまう。そこでTableViewerは,ドメインオブジェクトをTableViewerが認識できる形(具体的にはObjectの配列)に変換しようとする。そして,ドメインオブジェクトをTableViewerが認識できる形に変換する機構がContentProviderと呼ばれるもので,TableViewerの場合はIStructuredContentProviderインタフェースにその機構が規定されている。IStructuredContentProviderオブジェクトをsetContentProviderメソッドに渡してTableViewerにドメインオブジェクト変換機構をセットすれば,setInputメソッドで渡したドメインオブジェクトがTableViewerに認識される。
IStructuredContentProvider contentProvider = ...;
viewer.setContentProvider(contentProvider);
IStructuredContentProviderオブジェクトによって変換されたドメインオブジェクトは,Objectの配列,つまり行の情報を持つ任意の型のオブジェクトの配列としてTableViewerにより扱われるようになる。
さて,IStructuredContentProviderオブジェクトによって変換されたとしても,相変わらず行のデータはObject型という汎用的な型である。TableViewerは行のデータを持つオブジェクトの使い方なんて知る由もない。どのメソッドを呼んでデータを取得すればいいのか?取得したデータは何列目に表示すればいいのか?といったことがわからなければ,TableViewerはデータを表示できない。
TableViewerは,行のオブジェクトを元に何列目にどのような文字列を表示するかを決定しようとする。行の情報から各列の情報を取り出す機構がLabelProviderと呼ばれるもので,TableViewerの場合は通常ITableLabelProviderインタフェースに規定された機構が使用される。ITableLabelProviderオブジェクトを作成し,setLabelProviderメソッドにそれを渡すことで,TableViewerは各行の各列に何を表示すればいいのかを取得できるようになる。
ITableLabelProvider labelProvider = ...;
viewer.setLabelProvider(labelProvider);
以上のように,TableViewerは3つの部品を使ってデータを表示する。
(1) 表示したいデータを持つドメインオブジェクト
(2) ドメインオブジェクトを行単位の配列に変換するContentProvider
(3) 行単位のオブジェクトから列毎のデータを提供するLabelProvider
複雑に思うかもしれないが,やってみると実はSwingのJTableを使うときよりも単純だったりする。
上記の説明だけでは,なんのこっちゃさっぱりかもしれない。ContentProviderについては「TableViewer向けContentProviderの作成」を参照されたし。LabelProviderの作り方については後日紹介する予定である。
| 固定リンク
この記事へのコメントは終了しました。
コメント