TableViewer向けLabelProviderの作成
「TableViewer向けContentProviderの作成」で解説したContentProviderを作った結果,とりあえず行ごとのデータを持つオブジェクトの配列をTableViewerに提供することができるようになった。今回は,その行ごとのデータを各列に分解し,表示したい情報が正しく表として表示されるようにするための機構,LabelProviderを紹介する。これは「TableViewerのデータ供給・表示の仕組み」で示した3つの機構の最後である。
TableViewerの表のヘッダ列に関して,「TableViewerのヘッダ列の作成」で作り方を示した。ContentProviderで生成された行のオブジェクトを元に,各列にどのような文字列あるいはイメージを表示するかを決める機構がLabelProviderである。TableViewerでは,LabelProviderは通常ITableLabelProviderインタフェースの実装クラスとして作成する(「通常」というところがミソなのだが,これは後日紹介する)。
public class EmployeeLabelProvider
extends LabelProvider implements ITableLabelProvider {
public String getColumnText(Object element, int columnIndex) {
Employee employee = (Employee)element;
switch(columnIndex) {
case 0:
return employee.getName();
case 1:
return String.valueOf(employee.getAge());
}
return null;
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
}
上記のコードは,「TableViewerのデータ供給・表示の仕組み」で取り上げた社員一覧の表示に対するLabelProviderの実装例である。ITableLabelProviderインタフェースを実装し,さらにLabelProviderクラスを継承している。そして,メソッドとしてgetColumnTextメソッドとgetColumnImageメソッドを実装している。
ITableLabelProviderインタフェースは,各列のデータを返すgetColumn~メソッドのほかに,継承しているIBaseLabelProviderインタフェースで規定されたいくつかのメソッド(ILabelProviderListener登録関連のメソッドや後処理を担当するdisposeメソッドなど)を持っている。これらのメソッドを個別に実装しても良いのだが,実はそれらに関しては既にEclipseプラットフォームが提供しているLabelProviderクラスが実装してくれているので,今回はそれを拝借するためにLabelProviderクラスを継承している。通常はLabelProviderクラスを継承してしまってよいだろう。
さて,今回の本質のメソッドだが,getColumnTextメソッドで各列に表示する文字列を,getColumnImageメソッドで各列に表示するイメージをそれぞれ返却する。この際,第1引数にContentProviderで生成したオブジェクトの配列の各要素が,第2引数に列のインデックスが渡されてくる。一般的には,第1引数のオブジェクトをダウンキャストして目的の型にし,第2引数の列のインデックスに対してオブジェクトから適切にデータを取り出して表示したいデータとして返却する。上記のコードでは,まずEmployeeクラスでキャストし,0列目であればgetNameメソッドを呼び出して名前を返却し,1列目であればgetAgeメソッドを呼び出して年齢を取得し,それを文字列として返却している。
getColumnImageメソッドに関しても,基本的にやることはgetColumnTextメソッドと同じ。違う点は,文字列ではなくてイメージを返すことである。ただ,イメージの場合はいろいろと考えなければならないことがあるので,後日紹介することとして,今回はnullを返却することにする(「nullを返却する」=「イメージを表示しない」)。
LabelProviderができたところで,早速TableViewerにセットし,以下のようにして実行してみる。
List employeeList = ...; // ドメインオブジェクト作成
TableViewer viewer = ...; // TableViewerオブジェクト作成
// ヘッダ列の作成
viewer.setContentProvider(
new EmployeeContentProvider()); // ContentProvider作成
viewer.setLabelProvider(new EmployeeLabelProvider());
viewer.setInput(employeeList);
「TableViewer Test View」を表示されたときのスナップショットを以下に示す。ちゃんと社員一覧が表示された。
ちなみに,getColumn~メソッドは,「TableViewerのヘッダ列の作成」で作成した列数分呼び出される。つまり,引数のcolumnIndexは,0~(作成した列数-1)である。
| 固定リンク
この記事へのコメントは終了しました。
コメント