Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)

时间:2023-01-18 12:42:48
 有一个功能是我们常使用的,就是在列的头上点击一下,整个表的记录按照这个列来排序,再点击一下按照这个列的反序来排序。那JFace是如何实现这个功能的呢?
在JFace中是通过一个排序器来实现的,就是ViewerSorter下边写出详细的步骤
一、定义一个sorter继承自ViewerSorter
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)import  java.util.Date;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.jface.viewers.Viewer;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.jface.viewers.ViewerSorter;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
public   class  Sorter  extends  ViewerSorter  {
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
private static final int ID = 1;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
private static final int NAME = 2;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
private static final int SEX = 3;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
private static final int AGE = 4;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
private static final int CREATE_DATE = 5;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter ID_ASC = new Sorter(ID);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter ID_DESC = new Sorter(-ID);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter NAME_ASC = new Sorter(NAME);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter NAME_DESC = new Sorter(-NAME);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter SEX_ASC = new Sorter(SEX);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter SEX_DESC = new Sorter(-SEX);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter AGE_ASC = new Sorter(AGE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter AGE_DESC = new Sorter(-AGE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter CREATE_DATE_ASC = new Sorter(CREATE_DATE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public static final Sorter CREATE_DATE_DESC = new Sorter(-CREATE_DATE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
private int sortType ;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
private Sorter(int sortType){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
this.sortType = sortType;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
public int compare(Viewer viewer, Object e1, Object e2) {
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            People p1 
= (People)e1;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            People p2 
= (People)e2;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
switch(sortType){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case ID:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Long l1 
= p1.getId();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Long l2 
= p2.getId();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    
return l1.compareTo(l2);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case -ID:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Long l1 
= p1.getId();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Long l2 
= p2.getId();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    
return l2.compareTo(l1);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case NAME:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    String s1 
= p1.getName();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    String s2 
= p2.getName();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    
return s1.compareTo(s2);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case -NAME:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    String s1 
= p1.getName();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    String s2 
= p2.getName();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    
return s2.compareTo(s1);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case SEX:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    String s1 
= p1.getSex();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    String s2 
= p2.getSex();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    
return s1.compareTo(s2);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case -SEX:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    String s1 
= p1.getSex();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    String s2 
= p2.getSex();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    
return s2.compareTo(s1);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case AGE:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Integer i1 
= p1.getAge();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Integer i2 
= p2.getAge();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    
return i1.compareTo(i2);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case -AGE:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Integer i1 
= p1.getAge();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Integer i2 
= p2.getAge();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    
return i2.compareTo(i1);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case CREATE_DATE:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Date d1 
= p1.getCreateDate();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Date d2 
= p2.getCreateDate();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    d1.compareTo(d2);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                
case -CREATE_DATE:{
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Date d1 
= p1.getCreateDate();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    Date d2 
= p2.getCreateDate();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                    d2.compareTo(d1);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
return 0;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)    }
二、在TableViewer上,为每一列加入事件监听器类似这样的结构
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)    newColumnTableColumn.addSelectionListener( new  SelectionAdapter() {
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
boolean asc = true;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
public void widgetSelected(SelectionEvent e){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                tableViewer.setSorter(asc
?Sorter.ID_ASC:Sorter.ID_DESC);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                asc 
= !asc;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }
);
都加入后TestTableViewer的结果:
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)import  org.eclipse.jface.viewers.TableViewer;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.swt.SWT;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.swt.events.SelectionAdapter;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.swt.events.SelectionEvent;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.swt.layout.FillLayout;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.swt.widgets.Display;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.swt.widgets.Shell;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.swt.widgets.Table;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
import  org.eclipse.swt.widgets.TableColumn;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
public   class  TestTableViewer  {
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)    
private static Table table;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)    
/**
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)     * Launch the application
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)     * 
@param args
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)     
*/

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)    
public static void main(String[] args) {
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
final Display display = Display.getDefault();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
final Shell shell = new Shell();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        shell.setSize(
500375);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        shell.setText(
"SWT Application");
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
//
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
        final TableViewer tableViewer = new TableViewer(shell, SWT.CHECK|SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        table 
= tableViewer.getTable();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        table.setLinesVisible(
true);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        table.setHeaderVisible(
true);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        table.setBounds(
9779373154);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
final TableColumn newColumnTableColumn = new TableColumn(table, SWT.NONE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn.setWidth(
39);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn.setText(
"ID");
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
//加入事件监听器
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
        newColumnTableColumn.addSelectionListener(new SelectionAdapter(){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
boolean asc = true;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
public void widgetSelected(SelectionEvent e){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                tableViewer.setSorter(asc
?Sorter.ID_ASC:Sorter.ID_DESC);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                asc 
= !asc;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }
);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
final TableColumn newColumnTableColumn_1 = new TableColumn(table, SWT.NONE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn_1.setWidth(
85);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn_1.setText(
"姓名");
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
//        加入事件监听器
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
        newColumnTableColumn_1.addSelectionListener(new SelectionAdapter(){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
boolean asc = true;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
public void widgetSelected(SelectionEvent e){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                tableViewer.setSorter(asc
?Sorter.NAME_ASC:Sorter.NAME_DESC);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                asc 
= !asc;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }
);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
final TableColumn newColumnTableColumn_2 = new TableColumn(table, SWT.NONE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn_2.setWidth(
41);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn_2.setText(
"性别");
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
//        加入事件监听器
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
        newColumnTableColumn_2.addSelectionListener(new SelectionAdapter(){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
boolean asc = true;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
public void widgetSelected(SelectionEvent e){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                tableViewer.setSorter(asc
?Sorter.SEX_ASC:Sorter.SEX_DESC);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                asc 
= !asc;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }
);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
final TableColumn newColumnTableColumn_3 = new TableColumn(table, SWT.NONE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn_3.setWidth(
43);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn_3.setText(
"年龄");
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
//        加入事件监听器
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
        newColumnTableColumn_3.addSelectionListener(new SelectionAdapter(){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
boolean asc = true;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
public void widgetSelected(SelectionEvent e){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                tableViewer.setSorter(asc
?Sorter.AGE_ASC:Sorter.AGE_DESC);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                asc 
= !asc;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }
);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
final TableColumn newColumnTableColumn_4 = new TableColumn(table, SWT.NONE);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn_4.setWidth(
126);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        newColumnTableColumn_4.setText(
"创建日期");
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
//        加入事件监听器
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)
        newColumnTableColumn_4.addSelectionListener(new SelectionAdapter(){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
boolean asc = true;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
public void widgetSelected(SelectionEvent e){
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                tableViewer.setSorter(asc
?Sorter.CREATE_DATE_ASC:Sorter.CREATE_DATE_DESC);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                asc 
= !asc;
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }
);
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        tableViewer.setContentProvider(
new ContentProvider());
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        tableViewer.setLabelProvider(
new TableLabelProvider());
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        tableViewer.setInput(People.getPeople());
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        shell.open();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        shell.setLayout(
new FillLayout());
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        shell.layout();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        
while (!shell.isDisposed()) {
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)            
if (!display.readAndDispatch())
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)                display.sleep();
Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)        }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)    }

Swt/Jface tableViewer入门教程二(让TableViewer按照列排序)}

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