SWT Tips and Samples 基礎編 > TableViewer |
|
TableViewer基本イディオムTableViewerはテーブルをモデルとビューに切り分けて作るためのJFaceのフレームワークです。基本的な概念は、TreeViewerと変わりありません。モデルとしては、IStructuredContentProviderを継承したコンテントプロバイダー、ビューとしてはITableLabelProviderを継承したラベルプロバイダーを使っています。これら二つのモデルとビューをTableViewerにセットすればいいわけです。したがってテーブルを作るためのイディオムは以下のようになります。 TableViewer tv = new TableViewer(...); //カラムの追加やレイアウトの設定などは、Tableウィジェットを取得して行います Table table = tv.getTable(); TableColumn col1 = new TableColumn(table, ...); ... tv.setContentProvider(new TableContentProvider()); tv.setInput(...); tv.setLabelProvider(new TableLabelProvider()); ... class TableContentProvider implements IStructuredContentProvider{ public Object[] getElements(Object inputElement) { //このメソッドの引き数は、TableViewer#setInputで指定したオブジェクト //テーブルの行に対応する配列を返す。 ... return ...; } ... } class TableLabelProvider implements ITableLabelProvider{ public String getColumnText(Object element, int columnIndex) { //テーブルの行に対応するオブジェクトelementで、columnIndexに対応する //オブジェクトを返す。 return ...; } } コンテントプロバイダは、TableViewerのsetInputで与えられたオブジェクトを元にテーブルの行に相当する配列を返す処理をします。これを実装するには、getElementsメソッドをオーバーライドします。またラベルプロバイダーでは、getColumnTextをオーバーライドして、行に相当する要素をもとに、カラムに対応する文字列を返します。他にもオーバーライドできるメソッドはあるので、APIドキュメントを参照してみてください。 選択時の処理またテーブル要素の選択やダブルクリック時の処理を行うには、次のようなイディオムを利用するとよいでしょう。 TableViewer tv = new TableViewer(..); ... tv.addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); Object [] objs = sel.toArray(); //objsには、選択された行に対応するオブジェクトが格納されている ... } } tv.addDoubleClickListener(new IDoubleClickListener(){ public void doubleClick(DoubleClickEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); ... } } 選択やダブルクリックされた要素をIStructuredSelectionとして取り出したあと配列に直し、処理を行います。 サンプルプログラム以下のサンプルは、電話帳をテーブルに表示するプログラムです。二つの電話帳を保持していて、「リスト1」や「リスト2」のボタンを押すとテーブルの内容が変わります。これは、ボタンを押したときにsetInputメソッドでテーブルのソース情報を変更することで実現しています。 ソースコード (TableViewerTest.java)import java.util.ArrayList; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.ApplicationWindow; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; public class TableViewerTest extends ApplicationWindow { private ArrayList personList1; private ArrayList personList2; public TableViewerTest() { super(null); } public static void main(String[] args) { ApplicationWindow w = new TableViewerTest(); w.setBlockOnOpen(true); w.open(); Display.getCurrent().dispose(); } protected Control createContents(Composite parent) { getShell().setText("TableViewerTest"); Composite container = new Composite(parent, SWT.NONE); container.setLayout(new GridLayout(2, true)); //番号リストの初期化 personList1 = createPersonList1(); personList2 = createPersonList2(); final TableViewer tv = new TableViewer(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); //Tableの設定 Table table = tv.getTable(); GridData gd = new GridData(); gd.horizontalSpan = 2; gd.verticalSpan = 5; gd.heightHint = 200; gd.widthHint = 300; table.setLayoutData(gd); TableColumn col1 = new TableColumn(table, SWT.LEFT); col1.setText("名前"); col1.setWidth(100); TableColumn col2 = new TableColumn(table, SWT.LEFT); col2.setText("電話番号"); col2.setWidth(150); table.setHeaderVisible(true); //ContentProvider tv.setContentProvider(new TableContentProvider()); tv.setInput(personList1); //LabelProvider tv.setLabelProvider(new TableLabelProvider()); Button b1 = new Button(container, SWT.PUSH); b1.setText("リスト1"); b1.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { tv.setInput(personList1); } }); Button b2 = new Button(container, SWT.PUSH); b2.setText("リスト2"); b2.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { tv.setInput(personList2); } }); tv.addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); Object [] objs = sel.toArray(); for (int i=0; i<objs.length; i++){ Person p = (Person)objs[i]; System.out.println(p.name + " が選択されました。"); } } }); tv.addDoubleClickListener(new IDoubleClickListener(){ public void doubleClick(DoubleClickEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); Person p = (Person)sel.getFirstElement(); System.out.println(p.name + " がダブルクリックされました。"); } }); return container; } private ArrayList createPersonList1() { Person p1 = new Person("山田太郎", "111-111-1111"); Person p2 = new Person("鈴木花子", "222-222-2222"); ArrayList personList = new ArrayList(); personList.add(p1); personList.add(p2); return personList; } private ArrayList createPersonList2() { Person p1 = new Person("佐藤一郎", "333-333-3333"); Person p2 = new Person("高橋次郎", "444-444-4444"); ArrayList personList = new ArrayList(); personList.add(p1); personList.add(p2); return personList; } } class Person{ String name; String number; public Person(String name, String number){ this.name = name; this.number = number; } } class TableContentProvider implements IStructuredContentProvider{ public Object[] getElements(Object inputElement) { java.util.List array = (java.util.List)inputElement; return array.toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } class TableLabelProvider implements ITableLabelProvider{ public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { Person p = (Person)element; switch(columnIndex){ case 0: return p.name; case 1: return p.number; } return null; } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } } 最新更新日: 2005年6月13日 |
- PR -
★ フルーツメール【毎日懸賞】好評実施中!デジカメや金券が当たる! ★ 毎日懸賞 |
||||
|
|||||
Copyright(C) 2003,2004 Jasmin Project. All Right Reserved. |
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||