TableViewer に表示するためのデータを保持するクラスで、ITableLabelProvider インタフェースを実装しておくと、そのデータをどのようにテーブルに表示するかを指示することができます。
ITableLabelProvider インスタンスは TableViewer#setLabelProvider()
メソッドを使用してセットします。
ITableLabelProvider を利用してテーブルにデータを表示する手順は次のようになります。
ここではサンプルとして、ウェブサイトのタイトルと URL を保持するドメインオブジェクトを作成します。
public class SiteInfo {
public String title;
public String url;
public SiteInfo(String title, String url) {
this.title = title;
this.url = url;
}
}
ITableLabelProvider を実装することにより、独自のドメインオブジェクトをテーブルに表示する方法を定義します。
例えば、ITableLabelProvider#getColumnText()
はテーブルの各セルに表示するテキストを返すように実装します。
private class SiteInfoLabelProvider implements ITableLabelProvider {
// テキストの表示内容
public String getColumnText(Object element, int columnIndex) {
switch (columnIndex) {
case 0:
return ((SiteInfo) element).title;
case 1:
return ((SiteInfo) element).url;
}
return null;
}
...
}
第 1 引数の element
で独自のドメインオブジェクトを受け取ります。
第 2 引数の columnIndex
で列の番号が渡されます (0 base)。
columnIndex
はテーブルに設定された列の数 (N) に応じて 0 〜 N-1 の値が渡されます(作成された TableColumn の数がテーブルの列数になります)。
TableViewer viewer = new TableViewer(table);
viewer.setLabelProvider(new SiteInfoLabelProvider());
テーブルにドメインオブジェクトを追加する時は以下のメソッドを使用します。
TableViewer#add(Object obj)
TableViewer#add(Object[] objArray)
このメソッドを実行すると、setLabelProvider
で設定した ITableLabelProvider のメソッドが呼び出され、テーブルの各要素が表示されます。
viewer.add(new SiteInfo("Google", "http://google.com/"));
viewer.add(new SiteInfo("Sun Microsystems", "http://sun.com/"));
以上のコードをまとめると次のようになります。
/**
* 独自のドメインオブジェクト(ウェブサイトの情報)
*/
public class SiteInfo {
public String title;
public String url;
public SiteInfo(String title, String url) {
this.title = title;
this.url = url;
}
}
/**
* ドメインオブジェクト (SiteInfo) の表示方法を定義
*/
public class SiteInfoLabelProvider implements ITableLabelProvider {
// テキストの表示内容
public String getColumnText(Object element, int columnIndex) {
switch (columnIndex) {
case 0:
return ((SiteInfo) element).title;
case 1:
return ((SiteInfo) element).url;
}
return null;
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
}
public class Main {
private Shell shell = null;
private Table table = null;
/**
* テーブルの作成とデータの追加
*/
private void createTable() {
// テーブルオブジェクトを作成
table = new Table(shell, SWT.NONE);
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.setBounds(new org.eclipse.swt.graphics.Rectangle(0,0,400,100));
// テーブルのヘッダを作成
TableColumn header1 = new TableColumn(table, SWT.RIGHT);
header1.setText("Title");
header1.setWidth(200);
TableColumn header2 = new TableColumn(table, SWT.RIGHT);
header2.setText("URL");
header2.setWidth(200);
// ITableLabelProvider を TableViewer にセット.
TableViewer viewer = new TableViewer(table);
viewer.setLabelProvider(new SiteInfoLabelProvider());
// テーブルにデータを追加(ITableLabelProvider により表示される)
viewer.add(new SiteInfo("Google", "http://google.com/"));
viewer.add(new SiteInfo("Sun Microsystems", "http://sun.com/"));
}
...(snip)...
}
下記は JFace のテーブルの操作に関するメモです。
テーブルの各列の見出しは、TableColumn#setText
で設定できます。
// テーブルの列の見出しを設定
TableColumn tc1 = new TableColumn(table, SWT.CENTER);
TableColumn tc2 = new TableColumn(table, SWT.CENTER);
TableColumn tc3 = new TableColumn(table, SWT.CENTER);
tc1.setText("Header A");
tc2.setText("Header B");
tc3.setText("Header C");
tc1.setWidth(100);
tc2.setWidth(100);
tc3.setWidth(100);
TableColumn で列の見出しを設定しても、Table オブジェクトの headerVisible
プロパティが false
になっていると、見出し自体が表示されないので注意です。
// テーブルの列の見出しを可視化
table.setHeaderVisible(true);
テーブルにアイテムを追加する前に、テーブルの「列」の幅などを設定します。 列ごとに Tablecolumn を作成して設定します。
// テーブルの列のレイアウト設定
TableColumn tc1 = new TableColumn(table, SWT.RIGHT);
TableColumn tc2 = new TableColumn(table, SWT.RIGHT);
TableColumn tc3 = new TableColumn(table, SWT.RIGHT);
tc1.setWidth(100);
tc2.setWidth(100);
tc3.setWidth(100);
Table にアイテムを追加するには、TableItem を使用します。 TableItem は 1 行分のアイテムを表しています。
// Table に行を追加
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, "Item 1-A");
item.setText(1, "Item 1-B");
item.setText(2, "Item 1-C");
// 2 行目を追加
item = new TableItem(table, SWT.NONE);
item.setText(0, "Item 2-A");
item.setText(1, "Item 2-B");
item.setText(2, "Item 2-C");
// org.eclipse.swt.widgets.Table table;
table.setLinesVisible(true); // 罫線を表示
table.setLinesVisible(false); // 罫線を非表示