SWT Tips and Samples 基礎編 > ViewerFilter - テーブルのレコードをフィルタリング

 

ViewerFilter - テーブルのレコードをフィルタリング

JFaceのTableViewerには、レコードのフィルタリング機能があります。フィルタリングを行うには、ViewerFilterクラスから継承したクラスのインスタンスを、TableViewerにaddFilterメソッドで追加します。

TableViewer tv = new TableViewer(...);
MyFilter filter = new MyFilter(...);
//addFilterを実行すると、データはフィルタリングされる
tv.addFilter(filter);

class MyFilter extends ViewerFilter{
   public boolean select(Viewer v, Object p, Object e) {
      ...
      //表示したいレコードの場合は、trueを返す
      return ...
   }
}
...
tv.removeFilter(...);

実際のフィルタリングの処理は、ViewerFilterのselectメソッドをオーバーライドすることで実装できます。selectの3番目の引き数 e が、テーブルのレコードに対応するオブジェクトになっており、このメソッドでtrueを返したレコードのみが表示されるという仕組みです。

また追加したフィルターを取り除くには、removeFilter(ViewerFilter)メソッドを使います。

サンプルプログラム

男性のみを表示する MaleFilter と20歳以上のレコードを表示する AgeFilter の二つを作って、フィルタリングを行ったサンプルです。ボタンを押すとフィルタリングが行われますが、フィルターが追加されるたびに、表示されるレコードが狭められていくの分かると思います。

ソースコード (TableFilterTest.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.ViewerFilter;
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 TableFilterTest extends ApplicationWindow {

        private ArrayList personList;

        public TableFilterTest() {
                super(null);

        }
        public static void main(String[] args) {
                ApplicationWindow w = new TableFilterTest();
                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);
                TableColumn col4 = new TableColumn(table, SWT.LEFT);
                col4.setText("年齢");
                col4.setWidth(50);
                
                table.setHeaderVisible(true);

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

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

                //フィルターの作成
                final MaleFilter maleFilter = new MaleFilter();
                final AgeFilter ageFilter = new AgeFilter();

                //並べ替えのボタンの作成
                Button b1 = new Button(container, SWT.PUSH);
                b1.setText("男性のみを表示");
                b1.addSelectionListener(new SelectionAdapter(){
                        public void widgetSelected(SelectionEvent e) {
                                //Filterがセットされるとフィルタリングが実行される
                                tv.addFilter(maleFilter);
                        }
                });
                
                Button b2 = new Button(container, SWT.PUSH);
                b2.setText("20歳以上を表示");
                b2.addSelectionListener(new SelectionAdapter(){
                        public void widgetSelected(SelectionEvent e) {
                                //Filterがセットされるとフィルタリングが実行される
                                tv.addFilter(ageFilter);
                        }
                });
                
                Button b3 = new Button(container, SWT.PUSH);
                b3.setText("すべて表示");
                b3.addSelectionListener(new SelectionAdapter(){
                        public void widgetSelected(SelectionEvent e) {
                                tv.removeFilter(maleFilter);
                                tv.removeFilter(ageFilter);
                        }
                });             
                
                return container;
        }
        
        private ArrayList createPersonList() {
                Person p1 = new Person("00101", "ヤマダ タロウ", "男", 18);
                Person p2 = new Person("00102", "スズキ ハナコ", "女", 19);
                Person p3 = new Person("00103", "サトウ イチロウ", "男", 30);
                Person p4 = new Person("00104", "タカハシ ユウコ", "女", 28);
                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;
                int age;
                public Person(String id, String name, String number, int age) {
                        this.id = id;
                        this.name = name;
                        this.gender = number;
                        this.age = age;
                }
        }

        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;
                                case 3:
                                        return String.valueOf(p.age);
                        }
                        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 MaleFilter extends ViewerFilter{
                public boolean select(Viewer viewer, 
                                    Object parent, 
                                    Object e) {
                        String gender = ((Person)e).gender;
                        return gender.equals("男");
                }
        }
        
        //20歳以上を表示するフィルター
        class AgeFilter extends ViewerFilter{
                public boolean select(Viewer viewer, 
                                    Object parent, 
                                    Object e) {
                        int age = ((Person)e).age;
                        return age >= 20;
                }
        }
}


最新更新日: 2004年4月29日
 
関連リンク
Eclipse API ドキュメント
TableViewer
ViewerFilter
ILabelProviderListener
IStructuredContentProvider
ITableLabelProvider
JFace基礎編 - TableViewer
JFace基礎編 - ViewerSorter

- PR -

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

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

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

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

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

シマンテック 割引価格! オンライン販売だから低価格。いつでも簡単、見積・購入。

■原石のままでは、終わりたくない貴方へ!キャリアアップ転職を成功へとナビゲート

秋葉原・なんば・名古屋・札幌に店舗を構えるパソコンショップ!【ツクモ】


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