`

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

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

importorg.eclipse.jface.viewers.Viewer;
importorg.eclipse.jface.viewers.ViewerSorter;

publicclassSorterextendsViewerSorter{
privatestaticfinalintID=1;
privatestaticfinalintNAME=2;
privatestaticfinalintSEX=3;
privatestaticfinalintAGE=4;
privatestaticfinalintCREATE_DATE=5;

publicstaticfinalSorterID_ASC=newSorter(ID);
publicstaticfinalSorterID_DESC=newSorter(-ID);
publicstaticfinalSorterNAME_ASC=newSorter(NAME);
publicstaticfinalSorterNAME_DESC=newSorter(-NAME);
publicstaticfinalSorterSEX_ASC=newSorter(SEX);
publicstaticfinalSorterSEX_DESC=newSorter(-SEX);
publicstaticfinalSorterAGE_ASC=newSorter(AGE);
publicstaticfinalSorterAGE_DESC=newSorter(-AGE);
publicstaticfinalSorterCREATE_DATE_ASC=newSorter(CREATE_DATE);
publicstaticfinalSorterCREATE_DATE_DESC=newSorter(-CREATE_DATE);

privateintsortType;
privateSorter(intsortType){
this.sortType=sortType;
}

publicintcompare(Viewerviewer,Objecte1,Objecte2){
Peoplep1
=(People)e1;
Peoplep2
=(People)e2;
switch(sortType){
caseID:{
Longl1
=p1.getId();
Longl2
=p2.getId();
returnl1.compareTo(l2);
}

case-ID:{
Longl1
=p1.getId();
Longl2
=p2.getId();
returnl2.compareTo(l1);
}

caseNAME:{
Strings1
=p1.getName();
Strings2
=p2.getName();
returns1.compareTo(s2);
}

case-NAME:{
Strings1
=p1.getName();
Strings2
=p2.getName();
returns2.compareTo(s1);
}

caseSEX:{
Strings1
=p1.getSex();
Strings2
=p2.getSex();
returns1.compareTo(s2);
}

case-SEX:{
Strings1
=p1.getSex();
Strings2
=p2.getSex();
returns2.compareTo(s1);
}

caseAGE:{
Integeri1
=p1.getAge();
Integeri2
=p2.getAge();
returni1.compareTo(i2);
}

case-AGE:{
Integeri1
=p1.getAge();
Integeri2
=p2.getAge();
returni2.compareTo(i1);
}

caseCREATE_DATE:{
Dated1
=p1.getCreateDate();
Dated2
=p2.getCreateDate();
d1.compareTo(d2);
}

case-CREATE_DATE:{
Dated1
=p1.getCreateDate();
Dated2
=p2.getCreateDate();
d2.compareTo(d1);
}

}

return0;
}

}
二、在TableViewer上,为每一列加入事件监听器类似这样的结构
newColumnTableColumn.addSelectionListener(newSelectionAdapter(){
booleanasc=true;
publicvoidwidgetSelected(SelectionEvente){
tableViewer.setSorter(asc
?Sorter.ID_ASC:Sorter.ID_DESC);
asc
=!asc;
}

}
);
都加入后TestTableViewer的结果:
importorg.eclipse.jface.viewers.TableViewer;
importorg.eclipse.swt.SWT;
importorg.eclipse.swt.events.SelectionAdapter;
importorg.eclipse.swt.events.SelectionEvent;
importorg.eclipse.swt.layout.FillLayout;
importorg.eclipse.swt.widgets.Display;
importorg.eclipse.swt.widgets.Shell;
importorg.eclipse.swt.widgets.Table;
importorg.eclipse.swt.widgets.TableColumn;

publicclassTestTableViewer{
privatestaticTabletable;
/***//**
*Launchtheapplication
*
@paramargs
*/

publicstaticvoidmain(String[]args){
finalDisplaydisplay=Display.getDefault();
finalShellshell=newShell();
shell.setSize(
500,375);
shell.setText(
"SWTApplication");
//
finalTableViewertableViewer=newTableViewer(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);

finalTableColumnnewColumnTableColumn=newTableColumn(table,SWT.NONE);
newColumnTableColumn.setWidth(
39);
newColumnTableColumn.setText(
"ID");
//加入事件监听器
newColumnTableColumn.addSelectionListener(newSelectionAdapter(){
booleanasc=true;
publicvoidwidgetSelected(SelectionEvente){
tableViewer.setSorter(asc
?Sorter.ID_ASC:Sorter.ID_DESC);
asc
=!asc;
}

}
);

finalTableColumnnewColumnTableColumn_1=newTableColumn(table,SWT.NONE);
newColumnTableColumn_1.setWidth(
85);
newColumnTableColumn_1.setText(
"姓名");
//加入事件监听器
newColumnTableColumn_1.addSelectionListener(newSelectionAdapter(){
booleanasc=true;
publicvoidwidgetSelected(SelectionEvente){
tableViewer.setSorter(asc
?Sorter.NAME_ASC:Sorter.NAME_DESC);
asc
=!asc;
}

}
);

finalTableColumnnewColumnTableColumn_2=newTableColumn(table,SWT.NONE);
newColumnTableColumn_2.setWidth(
41);
newColumnTableColumn_2.setText(
"性别");
//加入事件监听器
newColumnTableColumn_2.addSelectionListener(newSelectionAdapter(){
booleanasc=true;
publicvoidwidgetSelected(SelectionEvente){
tableViewer.setSorter(asc
?Sorter.SEX_ASC:Sorter.SEX_DESC);
asc
=!asc;
}

}
);

finalTableColumnnewColumnTableColumn_3=newTableColumn(table,SWT.NONE);
newColumnTableColumn_3.setWidth(
43);
newColumnTableColumn_3.setText(
"年龄");
//加入事件监听器
newColumnTableColumn_3.addSelectionListener(newSelectionAdapter(){
booleanasc=true;
publicvoidwidgetSelected(SelectionEvente){
tableViewer.setSorter(asc
?Sorter.AGE_ASC:Sorter.AGE_DESC);
asc
=!asc;
}

}
);

finalTableColumnnewColumnTableColumn_4=newTableColumn(table,SWT.NONE);
newColumnTableColumn_4.setWidth(
126);
newColumnTableColumn_4.setText(
"创建日期");
//加入事件监听器
newColumnTableColumn_4.addSelectionListener(newSelectionAdapter(){
booleanasc=true;
publicvoidwidgetSelected(SelectionEvente){
tableViewer.setSorter(asc
?Sorter.CREATE_DATE_ASC:Sorter.CREATE_DATE_DESC);
asc
=!asc;
}

}
);

tableViewer.setContentProvider(
newContentProvider());
tableViewer.setLabelProvider(
newTableLabelProvider());
tableViewer.setInput(People.getPeople());

shell.open();
shell.setLayout(
newFillLayout());
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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics