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日
 
関連リンク
Eclipse API ドキュメント
TableViewer
IStructuredContentProvider
ITableLabelProvider

- PR -

★☆当選☆★・・・すれば?現金100万円当ります!!

★ フルーツメール【毎日懸賞】好評実施中!デジカメや金券が当たる! ★ 毎日懸賞

オフィス用品・オフィス家具 価 格 交 渉 可! 
◎ 目指せ★業界最安値 ★ ◎ オフィネット・ドットコム株式会社

マイクロソフト お得な見積! まとめての購入ならオトクな方法で。ライセンスだから管理も簡単。


Copyright(C) 2003,2004 Jasmin Project. All Right Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送