JTable排序类.docx
《JTable排序类.docx》由会员分享,可在线阅读,更多相关《JTable排序类.docx(17页珍藏版)》请在冰豆网上搜索。
![JTable排序类.docx](https://file1.bdocx.com/fileroot1/2023-1/7/0bf5066a-2294-4eea-a4ef-916233dc388e/0bf5066a-2294-4eea-a4ef-916233dc388e1.gif)
JTable排序类
/*
*@(#)SortManager.java05/1/13
*
*Copyright2005Swing4CNGroup.Allrightsreserved.
*/
packageorg.swing2cn.table;
importjava.awt.*;
importjava.awt.event.*;
importjava.util.*;
importjavax.swing.*;
importjavax.swing.event.*;
importjavax.swing.table.*;
importorg.swing2cn.util.*;
/**
*
*
Title:
Swing2CNProject
*
*
Description:
AProjectforSwingComponents
*
*
Copyright:
Copyright(c)2005
*
*
Organization:
Swing4CNGroup
*ThisClassisusedtoaddsortingfunctionthetheanyJTableinstancesorJTable'sChildrens.
*Thisisaveryconvenienttooltoplugin.Becauseitdon'teffectthetableandtheJTable
*instanceneedn'ttochangetheTableModeltoachievethesortingfunction.
*Warning:
*DuetothisClasswillusetheTableHeader,soifyourJTableinstancedosomespecialtoTableHeader
*mayoccurExceptionunexcepted.
*@authorme_gtm@>G.T.M.
*@version0.1
*ChineseDescriptions:
*这是一个很方便的类,使用者不需要为了实现排序功能而特别制定一个TableMoel。
只需要像使用插入式工具那样
*插入这个类,就可以方便地实现排序功能。
*警告:
*由于该类的实现过程设计TableHeader的处理,如果用户的JTable实例设计TableHeader的处理,可能会出现意外。
*/
publicclassSortManagerimplementsTableModelListener{
/**
*upIcon
*
*UpDownArrow
*
*@see#UpDownArrow
*/
finalstaticIconupIcon=newUpDownArrow(0);
/**
*downIcon
*
*UpDownArrow
*
*@see#UpDownArrow
*/
finalstaticIcondownIcon=newUpDownArrow
(1);
privateJTabletable;
privateTableModeldataModel;
/**
*sortColumn
*
*Thecurrentsortingcolumn.
*
*ChineseDescriptions:
*
*当前排序的列.
*
*
*/
privateintsortColumn;
privateRowrows[];
/**
*ascending
*
*Theorderofsorting.
*
*ChineseDescriptions:
*
*排序的顺序。
*/
privatebooleanascending;
/**
*sortableColumns
*
It'susedtopointoutwhichcolumnsaresortable.
*
ChineseDescriptions:
*
用来指出哪几列是需要排序功能的.
*
*
*/
privateintsortableColumns[];
/**
*SortManager
*
*Thebasewaytousethisclass.Itwillsortallthecolumnswhenuser
*clickit.
*
*ChineseDescriptions:
*
*该类基本用法,默认能给所有的列排序。
*
*
*
*@paramjtableJTable
*/
publicSortManager(JTablejtable){
rows=null;
ascending=true;
sortableColumns=null;
table=jtable;
inti=0;
intlength=jtable.getModel().getColumnCount();
finalint[]columns=newint[length];
for(;icolumns[i]=i;
}
sortableColumns=columns;
initialize();
}
/**
*SortManager
*
Thebasewaytousethisclass.Itwillsortthespecifiedcolumn
*whenuserclickit.
*
ChineseDescriptions:
*
该类基本用法,默认能给指定的列排序。
*
*
*
*@paramjtableJTable
*@paramiint
*Thecolumnuserspecifytosort.
*/
publicSortManager(JTablejtable,inti){
rows=null;
ascending=true;
sortableColumns=null;
table=jtable;
sortColumn=i;
initialize();
}
/**
*SortManager
*
Thebasewaytousethisclass.Itwillsortthespecifiedcolumns
*whenuserclickit.
*
ChineseDescriptions:
*
该类基本用法,默认能给指定的一组列排序。
*
*
*
*@paramjtableJTable
*@paramaiint[]
Thecolumnsuserspecifytosort.
*/
publicSortManager(JTablejtable,intai[]){
this(jtable,ai[0]);
sortableColumns=(int[])ai.clone();
}
/**
*initialize
*
InitializingtheJTablecamein,escpecaillytoaddthelistenersto
*JTable.
*
*ChineseDescriptions:
*
*初始化JTable实例,并且添加相应的侦听。
*/
publicvoidinitialize(){
dataModel=table.getModel();
((AbstractTableModel)dataModel).addTableModelListener(this);
addMouseListener(table);
JTableHeaderjtableheader=table.getTableHeader();
jtableheader.setDefaultRenderer(createHeaderRenderer());
if(table.getRowCount()>0){
reinitialize();
}
}
/**
*createHeaderRenderer
*
*CreatethespecifyHeaderRenderforthetable,canresponsethemouse
*actiontosortthecolumn.
*
*ChineseDescription:
*
*为table创建能够相应鼠标时间排序的TableHeaderRender。
*
*
*
*@returnTableCellRenderer
*/
protectedTableCellRenderercreateHeaderRenderer(){
DefaultTableCellRendererdefaultHeaderRenderer=newSortHeaderRenderer();
defaultHeaderRenderer.setHorizontalAlignment(0);
defaultHeaderRenderer.setHorizontalTextPosition
(2);
returndefaultHeaderRenderer;
}
publicvoidreinitialize(){
rows=null;
if(table.getRowCount()>0){
rows=newRow[table.getRowCount()];
for(inti=0;irows[i]=newRow();
rows[i].index=i;
}
if(columnIsSortable(sortColumn)){
sort();
}
}
}
/**
*columnIsSortable
*
Checkoutthatifthespecifycolumnissortable.Itdependonthe
*constructor.
*
*ChineseDescriptions:
*
*判断指定的列是否可排序,该方法的运行逻辑由整个类的构造函数构造时决定。
*
*
*
*@paramiint
*@returnboolean
*@see#publicSortModel(Containercontainer1,JTablejtable,inti)
*@see#publicSortModel(Containercontainer1,JTablejtable,intai[])
*@see#sortColumn
*@see#sortablrColumns
*/
privatebooleancolumnIsSortable(inti){
if(rows!
=null){
if(sortableColumns!
=null){
for(intj=0;jif(i==sortableColumns[j]){
returntrue;
}
}
}else{
returntrue;
}
}
returnfalse;
}
/**
*mouseClicked
*
TherealMethodtoaddmouselistenertoJTable.Duetothe
*SortHeaderRenderisainnerclassofthisclass.Sothesortcolumnuser
*wantcanshareandbemanagedinwholeclassfield.
*
ChineseDescription:
*
*这个才是真正的处理排序的方法之一,它对JTable添加鼠标时间侦听。
获得用户想排序的某行,由于SortHeaderRender是内部类,所以可以共享其数据并处理。
*
*@paramtableJTable
*/
publicvoidaddMouseListener(finalJTabletable){
table.getTableHeader().addMouseListener(newMouseAdapter(){
publicvoidmouseClicked(MouseEventmouseevent){
inti=table.columnAtPoint(mouseevent.getPoint());
intj=table.convertColumnIndexToModel(i);
//转换出用户想排序的列和底层数据的列,然后判断
if(!
columnIsSortable(j)){
return;
}
if(j==sortColumn){
ascending=!
ascending;
}else{
ascending=true;
sortColumn=j;
}
sort();
}
});
}
/**
*sort
*
Themainmethodtosorttherowsdependsonthespecifycolumnto
*sort.
*
ChineseDescriptions:
*
主要调用排序的方法。
*Fixbug:
table.UpdateUI();--->
*table.recalidate();
*table.repaint();
*
*@see#resetData()
*/
publicvoidsort(){
if(rows==null){
return;
}else{
((AbstractTableModel)dataModel).removeTableModelListener(this);
Arrays.sort(rows);
resetData();
((AbstractTableModel)dataModel).fireTableDataChanged();
((AbstractTableModel)dataModel).addTableModelListener(this);
table.revalidate();
table.repaint();
return;
}
}
/**
*resetData
*
*Thelaststeptosort.Weresetthesortedtothetableandshowthe
*changes.
*
*ChineseDescriptions:
*
*排序的最后一步,把排好序的数据重新返回table里面。
*
*@see#sort()
*/
publicvoidresetData(){
Vectordata=newVector(dataModel.getRowCount());
inti=0;
for(;iintj=0;
finalVectorvv=newVector(dataModel.getColumnCount());
for(;jvv.add(dataModel.getValueAt(i,j));
}
data.add(vv);
}
i=0;
for(;iif(rows[i].index!
=i){
intj=0;
finalVectorvv=(Vector)data.get(rows[i].index);
for(;jdataModel.setValueAt(vv.get(j),i,j);
}
}
}
}
publicvoidtableChanged(TableModelEventtablemodelevent){
reinitialize();
}
privateclassSortHeaderRendererextendsDefaultTableCellRenderer{
publicComponentgetTableCellRendererComponent(JTablejtable,
Objectobj,booleanflag,booleanflag1,inti,intj){
if(jtable!
=null){
JTableHeaderjtableheader=jtable.getTableHeader();
if(jtableheader!
=null){
setForeground(jtableheader.getForeground());
setBackground(jtableheader.getBackground());
setFont(jtableheader.getFont());
}
}
setText(obj!
=null?
obj.toString():
"");
intk=jtable.convertColumnIndexToModel(j);
if(k==sortColumn){
setIcon(ascending?
SortManager.upIcon:
SortManager.downIcon);
}else{
setIcon(null);
}
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
returnthis;
}
}
privateclassRowimplementsComparable{
privateRow(){
}
/*publicintcompareTo(Objectobj){
intresult=compare(obj);
Rowrow=(Row)obj;
Vectorrow1=newVector(dataModel.getColumnCount());
Vectorrow2=newVector(dataModel.getColumnCount());
inti=0;
for(;irow1.add(dataModel.getValueAt(index,i));
row2.add(dataModel.getValueAt(row.index,i));
}
if(result>=0){
}else{
intj=0;
for(;jdataModel.setValueAt(row1.get(j),row.index,j);
dataModel.setValueAt(row2.get(j),index,j);
}
}
returnresult;
}*/
publicintcompareTo(Objectobj){
Rowrow=(Row)obj;
//bugfoundandfixedbychenxing05.1.24.SupportLocalStringsorting,suchas//Chinese.
//ChineseDescriptions:
//支持本地字符的比较排序,例如:
中文排序。
java.text.CollatorcnCollator=java.text.Collator.getInstance(Locale.getDefault());
//////////////////////////////////////////
Objectobj1=dataModel.getValueAt(index,sortColumn);
Objectobj2=dataModel.getValueAt(row.index,sortColumn);
if(ascending){
if(!
(obj1instanceofComparable)){
return-1;
}
if(!
(obj2instanceofComparable)){
return1;
}else{
//if(obj1instanceofString||obj2instanceofString)
//{
returncnCpare(obj1,obj2);
//}
//else
//{
//return((Comparable)obj1).compareTo(obj2);
//}