<更新記録>
2007年 12月 27日
執筆

姉妹サイト検索 Web検索


TableViewer

TableViewer

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();
	}
}
この程度のことならば、Tableクラス、TableItemクラス、TableColumnクラスを直接操作しても作成できます。 TableViewerが威力を発揮するのは、このテーブルの中身を追加・削除・編集したりソートしたりする場合です。


Powered by VeryEasyCMS