JTable排序类.docx

上传人:b****6 文档编号:6577049 上传时间:2023-01-08 格式:DOCX 页数:17 大小:18.69KB
下载 相关 举报
JTable排序类.docx_第1页
第1页 / 共17页
JTable排序类.docx_第2页
第2页 / 共17页
JTable排序类.docx_第3页
第3页 / 共17页
JTable排序类.docx_第4页
第4页 / 共17页
JTable排序类.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

JTable排序类.docx

《JTable排序类.docx》由会员分享,可在线阅读,更多相关《JTable排序类.docx(17页珍藏版)》请在冰豆网上搜索。

JTable排序类.docx

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.

*@author

me_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(;i

columns[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;i

rows[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;j

if(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(;i

intj=0;

finalVectorvv=newVector(dataModel.getColumnCount());

for(;j

vv.add(dataModel.getValueAt(i,j));

}

data.add(vv);

}

i=0;

for(;i

if(rows[i].index!

=i){

intj=0;

finalVectorvv=(Vector)data.get(rows[i].index);

for(;j

dataModel.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(;i

row1.add(dataModel.getValueAt(index,i));

row2.add(dataModel.getValueAt(row.index,i));

}

if(result>=0){

}else{

intj=0;

for(;j

dataModel.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);

//}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1