SWT的TableVierer的使用二(数据排序)

时间:2023-12-15 19:50:20

有一个功能是我们常使用的,就是在列的头上点击一下,整个表的记录按照这个列来排序,再点击一下按照这个列的反序来排序。那JFace是如何实现这个功能的呢?
在JFace中是通过一个排序器来实现的,就是ViewerSorter下边写出详细的步骤
一、定义一个sorter继承自ViewerSorter

SWT的TableVierer的使用二(数据排序)import java.util.Date;
SWT的TableVierer的使用二(数据排序)
SWT的TableVierer的使用二(数据排序)import org.eclipse.jface.viewers.Viewer;
SWT的TableVierer的使用二(数据排序)import org.eclipse.jface.viewers.ViewerSorter;
SWT的TableVierer的使用二(数据排序)
SWT的TableVierer的使用二(数据排序)public class Sorter extends ViewerSorter {
SWT的TableVierer的使用二(数据排序)        private static final int ID = 1;
SWT的TableVierer的使用二(数据排序)        private static final int NAME = 2;
SWT的TableVierer的使用二(数据排序)        private static final int SEX = 3;
SWT的TableVierer的使用二(数据排序)        private static final int AGE = 4;
SWT的TableVierer的使用二(数据排序)        private static final int CREATE_DATE = 5;
SWT的TableVierer的使用二(数据排序)        
SWT的TableVierer的使用二(数据排序)        public static final Sorter ID_ASC = new Sorter(ID);
SWT的TableVierer的使用二(数据排序)        public static final Sorter ID_DESC = new Sorter(-ID);
SWT的TableVierer的使用二(数据排序)        public static final Sorter NAME_ASC = new Sorter(NAME);
SWT的TableVierer的使用二(数据排序)        public static final Sorter NAME_DESC = new Sorter(-NAME);
SWT的TableVierer的使用二(数据排序)        public static final Sorter SEX_ASC = new Sorter(SEX);
SWT的TableVierer的使用二(数据排序)        public static final Sorter SEX_DESC = new Sorter(-SEX);
SWT的TableVierer的使用二(数据排序)        public static final Sorter AGE_ASC = new Sorter(AGE);
SWT的TableVierer的使用二(数据排序)        public static final Sorter AGE_DESC = new Sorter(-AGE);
SWT的TableVierer的使用二(数据排序)        public static final Sorter CREATE_DATE_ASC = new Sorter(CREATE_DATE);
SWT的TableVierer的使用二(数据排序)        public static final Sorter CREATE_DATE_DESC = new Sorter(-CREATE_DATE);
SWT的TableVierer的使用二(数据排序)        
SWT的TableVierer的使用二(数据排序)        private int sortType ;
SWT的TableVierer的使用二(数据排序)        private Sorter(int sortType){
SWT的TableVierer的使用二(数据排序)            this.sortType = sortType;
SWT的TableVierer的使用二(数据排序)        }
SWT的TableVierer的使用二(数据排序)        public int compare(Viewer viewer, Object e1, Object e2) {
SWT的TableVierer的使用二(数据排序)            People p1 = (People)e1;
SWT的TableVierer的使用二(数据排序)            People p2 = (People)e2;
SWT的TableVierer的使用二(数据排序)            switch(sortType){
SWT的TableVierer的使用二(数据排序)                case ID:{
SWT的TableVierer的使用二(数据排序)                    Long l1 = p1.getId();
SWT的TableVierer的使用二(数据排序)                    Long l2 = p2.getId();
SWT的TableVierer的使用二(数据排序)                    return l1.compareTo(l2);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case -ID:{
SWT的TableVierer的使用二(数据排序)                    Long l1 = p1.getId();
SWT的TableVierer的使用二(数据排序)                    Long l2 = p2.getId();
SWT的TableVierer的使用二(数据排序)                    return l2.compareTo(l1);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case NAME:{
SWT的TableVierer的使用二(数据排序)                    String s1 = p1.getName();
SWT的TableVierer的使用二(数据排序)                    String s2 = p2.getName();
SWT的TableVierer的使用二(数据排序)                    return s1.compareTo(s2);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case -NAME:{
SWT的TableVierer的使用二(数据排序)                    String s1 = p1.getName();
SWT的TableVierer的使用二(数据排序)                    String s2 = p2.getName();
SWT的TableVierer的使用二(数据排序)                    return s2.compareTo(s1);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case SEX:{
SWT的TableVierer的使用二(数据排序)                    String s1 = p1.getSex();
SWT的TableVierer的使用二(数据排序)                    String s2 = p2.getSex();
SWT的TableVierer的使用二(数据排序)                    return s1.compareTo(s2);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case -SEX:{
SWT的TableVierer的使用二(数据排序)                    String s1 = p1.getSex();
SWT的TableVierer的使用二(数据排序)                    String s2 = p2.getSex();
SWT的TableVierer的使用二(数据排序)                    return s2.compareTo(s1);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case AGE:{
SWT的TableVierer的使用二(数据排序)                    Integer i1 = p1.getAge();
SWT的TableVierer的使用二(数据排序)                    Integer i2 = p2.getAge();
SWT的TableVierer的使用二(数据排序)                    return i1.compareTo(i2);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case -AGE:{
SWT的TableVierer的使用二(数据排序)                    Integer i1 = p1.getAge();
SWT的TableVierer的使用二(数据排序)                    Integer i2 = p2.getAge();
SWT的TableVierer的使用二(数据排序)                    return i2.compareTo(i1);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case CREATE_DATE:{
SWT的TableVierer的使用二(数据排序)                    Date d1 = p1.getCreateDate();
SWT的TableVierer的使用二(数据排序)                    Date d2 = p2.getCreateDate();
SWT的TableVierer的使用二(数据排序)                    d1.compareTo(d2);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)                case -CREATE_DATE:{
SWT的TableVierer的使用二(数据排序)                    Date d1 = p1.getCreateDate();
SWT的TableVierer的使用二(数据排序)                    Date d2 = p2.getCreateDate();
SWT的TableVierer的使用二(数据排序)                    d2.compareTo(d1);
SWT的TableVierer的使用二(数据排序)                }
SWT的TableVierer的使用二(数据排序)            }
SWT的TableVierer的使用二(数据排序)            return 0;
SWT的TableVierer的使用二(数据排序)        }
SWT的TableVierer的使用二(数据排序)    }

二、在TableViewer上,为每一列加入事件监听器类似这样的结构

SWT的TableVierer的使用二(数据排序)    newColumnTableColumn.addSelectionListener(new SelectionAdapter(){
SWT的TableVierer的使用二(数据排序)            boolean asc = true;
SWT的TableVierer的使用二(数据排序)            public void widgetSelected(SelectionEvent e){
SWT的TableVierer的使用二(数据排序)                tableViewer.setSorter(asc?Sorter.ID_ASC:Sorter.ID_DESC);
SWT的TableVierer的使用二(数据排序)                asc = !asc;
SWT的TableVierer的使用二(数据排序)            }
SWT的TableVierer的使用二(数据排序)        });

都加入后TestTableViewer的结果:

SWT的TableVierer的使用二(数据排序)import org.eclipse.jface.viewers.TableViewer;
SWT的TableVierer的使用二(数据排序)import org.eclipse.swt.SWT;
SWT的TableVierer的使用二(数据排序)import org.eclipse.swt.events.SelectionAdapter;
SWT的TableVierer的使用二(数据排序)import org.eclipse.swt.events.SelectionEvent;
SWT的TableVierer的使用二(数据排序)import org.eclipse.swt.layout.FillLayout;
SWT的TableVierer的使用二(数据排序)import org.eclipse.swt.widgets.Display;
SWT的TableVierer的使用二(数据排序)import org.eclipse.swt.widgets.Shell;
SWT的TableVierer的使用二(数据排序)import org.eclipse.swt.widgets.Table;
SWT的TableVierer的使用二(数据排序)import org.eclipse.swt.widgets.TableColumn;
SWT的TableVierer的使用二(数据排序)
SWT的TableVierer的使用二(数据排序)public class TestTableViewer {
SWT的TableVierer的使用二(数据排序)    private static Table table;
SWT的TableVierer的使用二(数据排序)    /**
SWT的TableVierer的使用二(数据排序)     * Launch the application
SWT的TableVierer的使用二(数据排序)     * @param args
SWT的TableVierer的使用二(数据排序)     */
SWT的TableVierer的使用二(数据排序)    public static void main(String[] args) {
SWT的TableVierer的使用二(数据排序)        final Display display = Display.getDefault();
SWT的TableVierer的使用二(数据排序)        final Shell shell = new Shell();
SWT的TableVierer的使用二(数据排序)        shell.setSize(500, 375);
SWT的TableVierer的使用二(数据排序)        shell.setText("SWT Application");
SWT的TableVierer的使用二(数据排序)        //
SWT的TableVierer的使用二(数据排序)        final TableViewer tableViewer = new TableViewer(shell, SWT.CHECK|SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL);
SWT的TableVierer的使用二(数据排序)        
SWT的TableVierer的使用二(数据排序)        table = tableViewer.getTable();
SWT的TableVierer的使用二(数据排序)        table.setLinesVisible(true);
SWT的TableVierer的使用二(数据排序)        table.setHeaderVisible(true);
SWT的TableVierer的使用二(数据排序)        table.setBounds(97, 79, 373, 154);
SWT的TableVierer的使用二(数据排序)
SWT的TableVierer的使用二(数据排序)        final TableColumn newColumnTableColumn = new TableColumn(table, SWT.NONE);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn.setWidth(39);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn.setText("ID");
SWT的TableVierer的使用二(数据排序)        //加入事件监听器
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn.addSelectionListener(new SelectionAdapter(){
SWT的TableVierer的使用二(数据排序)            boolean asc = true;
SWT的TableVierer的使用二(数据排序)            public void widgetSelected(SelectionEvent e){
SWT的TableVierer的使用二(数据排序)                tableViewer.setSorter(asc?Sorter.ID_ASC:Sorter.ID_DESC);
SWT的TableVierer的使用二(数据排序)                asc = !asc;
SWT的TableVierer的使用二(数据排序)            }
SWT的TableVierer的使用二(数据排序)        });
SWT的TableVierer的使用二(数据排序)
SWT的TableVierer的使用二(数据排序)        final TableColumn newColumnTableColumn_1 = new TableColumn(table, SWT.NONE);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_1.setWidth(85);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_1.setText("姓名");
SWT的TableVierer的使用二(数据排序)//        加入事件监听器
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_1.addSelectionListener(new SelectionAdapter(){
SWT的TableVierer的使用二(数据排序)            boolean asc = true;
SWT的TableVierer的使用二(数据排序)            public void widgetSelected(SelectionEvent e){
SWT的TableVierer的使用二(数据排序)                tableViewer.setSorter(asc?Sorter.NAME_ASC:Sorter.NAME_DESC);
SWT的TableVierer的使用二(数据排序)                asc = !asc;
SWT的TableVierer的使用二(数据排序)            }
SWT的TableVierer的使用二(数据排序)        });
SWT的TableVierer的使用二(数据排序)        
SWT的TableVierer的使用二(数据排序)        final TableColumn newColumnTableColumn_2 = new TableColumn(table, SWT.NONE);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_2.setWidth(41);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_2.setText("性别");
SWT的TableVierer的使用二(数据排序)//        加入事件监听器
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_2.addSelectionListener(new SelectionAdapter(){
SWT的TableVierer的使用二(数据排序)            boolean asc = true;
SWT的TableVierer的使用二(数据排序)            public void widgetSelected(SelectionEvent e){
SWT的TableVierer的使用二(数据排序)                tableViewer.setSorter(asc?Sorter.SEX_ASC:Sorter.SEX_DESC);
SWT的TableVierer的使用二(数据排序)                asc = !asc;
SWT的TableVierer的使用二(数据排序)            }
SWT的TableVierer的使用二(数据排序)        });
SWT的TableVierer的使用二(数据排序)        
SWT的TableVierer的使用二(数据排序)        final TableColumn newColumnTableColumn_3 = new TableColumn(table, SWT.NONE);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_3.setWidth(43);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_3.setText("年龄");
SWT的TableVierer的使用二(数据排序)//        加入事件监听器
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_3.addSelectionListener(new SelectionAdapter(){
SWT的TableVierer的使用二(数据排序)            boolean asc = true;
SWT的TableVierer的使用二(数据排序)            public void widgetSelected(SelectionEvent e){
SWT的TableVierer的使用二(数据排序)                tableViewer.setSorter(asc?Sorter.AGE_ASC:Sorter.AGE_DESC);
SWT的TableVierer的使用二(数据排序)                asc = !asc;
SWT的TableVierer的使用二(数据排序)            }
SWT的TableVierer的使用二(数据排序)        });
SWT的TableVierer的使用二(数据排序)        
SWT的TableVierer的使用二(数据排序)        final TableColumn newColumnTableColumn_4 = new TableColumn(table, SWT.NONE);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_4.setWidth(126);
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_4.setText("创建日期");
SWT的TableVierer的使用二(数据排序)//        加入事件监听器
SWT的TableVierer的使用二(数据排序)        newColumnTableColumn_4.addSelectionListener(new SelectionAdapter(){
SWT的TableVierer的使用二(数据排序)            boolean asc = true;
SWT的TableVierer的使用二(数据排序)            public void widgetSelected(SelectionEvent e){
SWT的TableVierer的使用二(数据排序)                tableViewer.setSorter(asc?Sorter.CREATE_DATE_ASC:Sorter.CREATE_DATE_DESC);
SWT的TableVierer的使用二(数据排序)                asc = !asc;
SWT的TableVierer的使用二(数据排序)            }
SWT的TableVierer的使用二(数据排序)        });
SWT的TableVierer的使用二(数据排序)        
SWT的TableVierer的使用二(数据排序)        tableViewer.setContentProvider(new ContentProvider());
SWT的TableVierer的使用二(数据排序)        tableViewer.setLabelProvider(new TableLabelProvider());
SWT的TableVierer的使用二(数据排序)        tableViewer.setInput(People.getPeople());
SWT的TableVierer的使用二(数据排序)        
SWT的TableVierer的使用二(数据排序)        shell.open();
SWT的TableVierer的使用二(数据排序)        shell.setLayout(new FillLayout());
SWT的TableVierer的使用二(数据排序)        shell.layout();
SWT的TableVierer的使用二(数据排序)        while (!shell.isDisposed()) {
SWT的TableVierer的使用二(数据排序)            if (!display.readAndDispatch())
SWT的TableVierer的使用二(数据排序)                display.sleep();
SWT的TableVierer的使用二(数据排序)        }
SWT的TableVierer的使用二(数据排序)    }
SWT的TableVierer的使用二(数据排序)}

试一下结果是不是出来了?
好了,最后解释几点:
1,sorter中利用了jdk的compareTo来实现比较,当然你也可以根据自己的需求来实现。
2,  sorter中利用了"-"符号来得到正负数字,用来表现升序、降序。
source下载:http://www.blogjava.net/Files/dreamstone/jface-2.rar

效果:

SWT的TableVierer的使用二(数据排序)

SWT的TableVierer的使用二(数据排序)