Swt/Jface tableViewer入门教程2

有一个功能是我们常使用的,就是在列的头上点击一下,整个表的记录按照这个列来排序,再点击一下按照这个列的反序来排序。那JFace是如何实现这个功能的呢? 在JFace中是通过一个排序器来实现的,就是ViewerSorter下边写出详细的步骤 一、定义一个sorter继承自ViewerSorter
import java.util.Date; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; public class Sorter extends ViewerSorter {         private static final int ID = 1;         private static final int NAME = 2;         private static final int SEX = 3;         private static final int AGE = 4;         private static final int CREATE_DATE = 5;                 public static final Sorter ID_ASC = new Sorter(ID);         public static final Sorter ID_DESC = new Sorter(-ID);         public static final Sorter NAME_ASC = new Sorter(NAME);         public static final Sorter NAME_DESC = new Sorter(-NAME);         public static final Sorter SEX_ASC = new Sorter(SEX);         public static final Sorter SEX_DESC = new Sorter(-SEX);         public static final Sorter AGE_ASC = new Sorter(AGE);         public static final Sorter AGE_DESC = new Sorter(-AGE);         public static final Sorter CREATE_DATE_ASC = new Sorter(CREATE_DATE);         public static final Sorter CREATE_DATE_DESC = new Sorter(-CREATE_DATE);                 private int sortType ;         private Sorter(int sortType){             this.sortType = sortType;         }         public int compare(Viewer viewer, Object e1, Object e2) {             People p1 = (People)e1;             People p2 = (People)e2;             switch(sortType){                 case ID:{                     Long l1 = p1.getId();                     Long l2 = p2.getId();                     return l1.compareTo(l2);                 }                 case -ID:{                     Long l1 = p1.getId();                     Long l2 = p2.getId();                     return l2.compareTo(l1);                 }                 case NAME:{                     String s1 = p1.getName();                     String s2 = p2.getName();                     return s1.compareTo(s2);                 }                 case -NAME:{                     String s1 = p1.getName();                     String s2 = p2.getName();                     return s2.compareTo(s1);                 }                 case SEX:{                     String s1 = p1.getSex();                     String s2 = p2.getSex();                     return s1.compareTo(s2);                 }                 case -SEX:{                     String s1 = p1.getSex();                     String s2 = p2.getSex();                     return s2.compareTo(s1);                 }                 case AGE:{                     Integer i1 = p1.getAge();                     Integer i2 = p2.getAge();                     return i1.compareTo(i2);                 }                 case -AGE:{                     Integer i1 = p1.getAge();                     Integer i2 = p2.getAge();                     return i2.compareTo(i1);                 }                 case CREATE_DATE:{                     Date d1 = p1.getCreateDate();                     Date d2 = p2.getCreateDate();                     d1.compareTo(d2);                 }                 case -CREATE_DATE:{                     Date d1 = p1.getCreateDate();                     Date d2 = p2.getCreateDate();                     d2.compareTo(d1);                 }             }             return 0;         }     }
二、在TableViewer上,为每一列加入事件监听器类似这样的结构
 newColumnTableColumn.addSelectionListener(new SelectionAdapter(){             boolean asc = true;             public void widgetSelected(SelectionEvent e){                 tableViewer.setSorter(asc?Sorter.ID_ASC:Sorter.ID_DESC);                 asc = !asc;             }         });
都加入后TestTableViewer的结果:
import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; 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 TestTableViewer {     private static Table table;     /** *//**      * Launch the application      * @param args      */     public static void main(String[] args) {         final Display display = Display.getDefault();         final Shell shell = new Shell();         shell.setSize(500, 375);         shell.setText("SWT Application");         //         final TableViewer tableViewer = new TableViewer(shell, SWT.CHECK|SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL);                 table = tableViewer.getTable();         table.setLinesVisible(true);         table.setHeaderVisible(true);         table.setBounds(97, 79, 373, 154);         final TableColumn newColumnTableColumn = new TableColumn(table, SWT.NONE);         newColumnTableColumn.setWidth(39);         newColumnTableColumn.setText("ID");         //加入事件监听器         newColumnTableColumn.addSelectionListener(new SelectionAdapter(){             boolean asc = true;             public void widgetSelected(SelectionEvent e){                 tableViewer.setSorter(asc?Sorter.ID_ASC:Sorter.ID_DESC);                 asc = !asc;             }         });         final TableColumn newColumnTableColumn_1 = new TableColumn(table, SWT.NONE);         newColumnTableColumn_1.setWidth(85);         newColumnTableColumn_1.setText("姓名"); //        加入事件监听器         newColumnTableColumn_1.addSelectionListener(new SelectionAdapter(){             boolean asc = true;             public void widgetSelected(SelectionEvent e){                 tableViewer.setSorter(asc?Sorter.NAME_ASC:Sorter.NAME_DESC);                 asc = !asc;             }         });                 final TableColumn newColumnTableColumn_2 = new TableColumn(table, SWT.NONE);         newColumnTableColumn_2.setWidth(41);         newColumnTableColumn_2.setText("性别"); //        加入事件监听器         newColumnTableColumn_2.addSelectionListener(new SelectionAdapter(){             boolean asc = true;             public void widgetSelected(SelectionEvent e){                 tableViewer.setSorter(asc?Sorter.SEX_ASC:Sorter.SEX_DESC);                 asc = !asc;             }         });                 final TableColumn newColumnTableColumn_3 = new TableColumn(table, SWT.NONE);         newColumnTableColumn_3.setWidth(43);         newColumnTableColumn_3.setText("年龄"); //        加入事件监听器         newColumnTableColumn_3.addSelectionListener(new SelectionAdapter(){             boolean asc = true;             public void widgetSelected(SelectionEvent e){                 tableViewer.setSorter(asc?Sorter.AGE_ASC:Sorter.AGE_DESC);                 asc = !asc;             }         });                 final TableColumn newColumnTableColumn_4 = new TableColumn(table, SWT.NONE);         newColumnTableColumn_4.setWidth(126);         newColumnTableColumn_4.setText("创建日期"); //        加入事件监听器         newColumnTableColumn_4.addSelectionListener(new SelectionAdapter(){             boolean asc = true;             public void widgetSelected(SelectionEvent e){                 tableViewer.setSorter(asc?Sorter.CREATE_DATE_ASC:Sorter.CREATE_DATE_DESC);                 asc = !asc;             }         });                 tableViewer.setContentProvider(new ContentProvider());         tableViewer.setLabelProvider(new TableLabelProvider());         tableViewer.setInput(People.getPeople());                 shell.open();         shell.setLayout(new FillLayout());         shell.layout();         while (!shell.isDisposed()) {             if (!display.readAndDispatch())                 display.sleep();         }     } }
试一下结果是不是出来了? 好了,最后解释几点: 1,sorter中利用了jdk的compareTo来实现比较,当然你也可以根据自己的需求来实现。 2,  sorter中利用了"-"符号来得到正负数字,用来表现升序、降序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值