zoukankan      html  css  js  c++  java
  • SWT的TableVierer的使用二(数据排序)

    有一个功能是我们常使用的,就是在列的头上点击一下,整个表的记录按照这个列来排序,再点击一下按照这个列的反序来排序。那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中利用了"-"符号来得到正负数字,用来表现升序、降序。
    source下载:http://www.blogjava.net/Files/dreamstone/jface-2.rar

    效果:

  • 相关阅读:
    索引查找Java实现
    经典算法之折半查找
    进制转换问题
    排序算法总结之希尔排序
    自己写的栈
    排序问题Java
    画柱状图Java
    一些值得看的性能优化的文章
    理解 BFC
    canvas
  • 原文地址:https://www.cnblogs.com/wangjiyuan/p/table1.html
Copyright © 2011-2022 走看看