SWT Tips and Samples 基礎編 > ViewerSorter - テーブルの並べ替え

 

ViewerSorter - テーブルの並べ替え

JFaceのTableViewerには、並べ替えの機構が用意されています。テーブルのレコードを並べ替えるには、ViewerSorterクラスを継承したクラスを TableViewerのsetSorter メソッドでセットするだけです。並べ替えのロジックは、ViewerSorterクラスのcompareメソッドをオーバーライドすることで実装します。

TableViewer tv = new TableViewer(...);
//setSorterを実行するとソートが行われる
tv.setSoter(new MyTableSorter());

class MyTableSorter extends ViewerSorter{
   public int compare(Viewer viewer, Object e1, Object e2) {
      ...
      //e1<e2のときは負の値、e1=e2のときは0
      //e1>e2のときは正の値を返すように計算する
      return ret;
   }
}

TableViewerのsetSorterメソッドが呼ばれた瞬間に、実際の並べ替えが行われます。

サンプルプログラム

「名前で並べ替え」のボタンをクリックすると、ソートが行われます。

ソースコード (TableSortTest.java)

import java.util.ArrayList;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
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 TableSortTest extends ApplicationWindow {

        private ArrayList personList;

        public TableSortTest() {
                super(null);

        }
        public static void main(String[] args) {
                ApplicationWindow w = new TableSortTest();
                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(3, true));

                //リストの初期化
                personList = createPersonList();

                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 = 3;
                gd.verticalSpan = 5;
                gd.heightHint = 200;
                gd.widthHint = 300;
                table.setLayoutData(gd);
                TableColumn col1 = new TableColumn(table, SWT.LEFT);
                col1.setText("社員番号");
                col1.setWidth(80);
                TableColumn col2 = new TableColumn(table, SWT.LEFT);
                col2.setText("名前");
                col2.setWidth(130);
                TableColumn col3 = new TableColumn(table, SWT.LEFT);
                col3.setText("性別");
                col3.setWidth(50);

                table.setHeaderVisible(true);

                //ContentProvider
                tv.setContentProvider(new TableContentProvider());
                tv.setInput(personList);

                //LabelProvider
                tv.setLabelProvider(new TableLabelProvider());
                tv.setInput(personList);

                //並べ替えのボタンの作成
                Button b1 = new Button(container, SWT.PUSH);
                b1.setText("名前で並べ替え");
                b1.addSelectionListener(new SelectionAdapter(){
                        public void widgetSelected(SelectionEvent e) {
                                //Sorterがセットされるとソートが実行される
                                tv.setSorter(new PersonNameSorter());
                        }
                });
                return container;
        }
        
        private ArrayList createPersonList() {
                Person p1 = new Person("00101", "ヤマダ タロウ", "男");
                Person p2 = new Person("00102", "スズキ ハナコ", "女");
                Person p3 = new Person("00103", "サトウ イチロウ", "男");
                Person p4 = new Person("00104", "タカハシ ジロウ", "女");
                ArrayList personList = new ArrayList();
                personList.add(p1);
                personList.add(p2);
                personList.add(p3);
                personList.add(p4);
                return personList;
        }

        class Person {
                String id;
                String name;
                String gender;
                public Person(String id, String name, String number) {
                        this.id = id;
                        this.name = name;
                        this.gender = 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.id;
                                case 1 :
                                        return p.name;
                                case 2 :
                                        return p.gender;
                        }
                        return null;
                }
                public void addListener(ILabelProviderListener listener) {
                }
                public void dispose() {
                }
                public boolean isLabelProperty(Object element, String property) {
                        return false;
                }
                public void removeListener(ILabelProviderListener listener) {
                }
        }
        
        class PersonNameSorter extends ViewerSorter {
                public int compare(Viewer viewer, 
                                 Object e1, 
                                 Object e2) {
                        Person p1 = (Person) e1;
                        Person p2 = (Person) e2;
                        String str1 = p1.name;
                        String str2 = p2.name;
                        int ret = str1.compareTo(str2);
                        return ret;
                }

        }
}


最新更新日: 2004年7月14日
 
関連リンク
Eclipse API ドキュメント
TableViewer
ViewerSorter
ILabelProviderListener
IStructuredContentProvider
ITableLabelProvider

- PR -

プレゼンテーション作成ソフト無料お試し版配信中

【Sony】大手他社よりも安い!ビジネス向け光・100Mしかも固定IP付!今なら更に初期費用最大15,000円OFF!

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

注文から納品まで驚きの早さ!!【ASKULカタログ】はこちらから・・・

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


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