TableViewerクラスは、テーブルを表示するためのViewer Frameworkです。 Tableクラスを直接操作してテーブルを作成してもよいのですが、 行も列も複数あって、格納されているアイテムの操作等を行おうとすると、そのロジックは複雑になります。
TableViewerクラスは、テーブルの行と列の値の表示や操作をフレームワーク化することで、 簡潔な一定の手法でプログラミングを行うためのフレームワークを提供します。
まずはTableViewerを使ってテーブルを表示するところから説明します。 「○○Viewer」を使ってアイテムを表示するには、Viewer、IContentProvider、IBaseLabelProviderが必要なのでした。 TableViewerでテーブルを作成する場合、IContentProviderのサブインターフェイスのIStructuredContentProviderインターフェイスと、 IBaseLabelProviderのサブインターフェイスのITableLabelProviderインターフェイスを使います。
ITableLabelProvider#getColumnText(Object, int)メソッドは、第2引数で渡されるインデックスを元に、 適切な列の値のテキストを返してやる必要があります。
import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
public class ViewingTable extends Composite {
private enum SEX {MAN, WOMAN};
private class PersonalInformation {
public String name;
public SEX sex;
public byte age;
public PersonalInformation(String name, SEX sex, byte age) {
this.name = name;
this.sex = sex;
this.age = age;
}
}
private PersonalInformation[] INPUT = {
new PersonalInformation("Venjamin", SEX.MAN, (byte)20),
new PersonalInformation("Bobby", SEX.MAN, (byte)19),
new PersonalInformation("Sarry", SEX.WOMAN, (byte)34),
new PersonalInformation("Anna", SEX.WOMAN, (byte)27)
};
public ViewingTable(Composite parent) {
super(parent, SWT.NONE);
TableViewer tableViewer = new TableViewer(createTable(parent));
tableViewer.setLabelProvider(new PersonalInformationLabelProvider());
tableViewer.setContentProvider(new PersonalInformationContentProvider());
tableViewer.setInput(INPUT);
tableViewer.getControl().setSize(300, 300);
}
private Table createTable(Composite parent) {
Table table = new Table(parent, SWT.MULTI);
TableLayout layout = new TableLayout();
layout.addColumnData(new ColumnWeightData(33, true));
layout.addColumnData(new ColumnWeightData(33, true));
layout.addColumnData(new ColumnWeightData(33, true));
table.setLayout(layout);
TableColumn nameColumn = new TableColumn(table, SWT.LEFT);
nameColumn.setText("name");
TableColumn sexColumn = new TableColumn(table, SWT.CENTER);
sexColumn.setText("sex");
TableColumn ageColumn = new TableColumn(table, SWT.RIGHT);
ageColumn.setText("age");
table.setHeaderVisible(true);
return table;
}
private class PersonalInformationContentProvider
implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
// inputElementオブジェクトは、
// TableViewer#setInput(Object)メソッドに渡した
// INPUT(PersonInformation配列)。
return (Object[])inputElement;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private class PersonalInformationLabelProvider
extends BaseLabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
PersonalInformation pInfo = (PersonalInformation)element;
switch (columnIndex) {
case 0:
return pInfo.name;
case 1:
return pInfo.sex.toString();
case 2:
return String.valueOf(pInfo.age);
default:
return "out of data";
}
}
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
ViewingTable contributeTable = new ViewingTable(shell);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
