春风博客

春天里,百花香...

导航

<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

公告

MAIL: junglesong@gmail.com
MSN: junglesong_5@hotmail.com

Locations of visitors to this page

常用链接

留言簿(11)

随笔分类(224)

随笔档案(126)

个人软件下载

我的其它博客

我的邻居们

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

利用MouseAdapter来实现自排序的表格

本文参考了http://www.java2s.com/Code/Java/Swing-JFC/TableSortTest.htm的做法。主要处理是取得用户点击的列,得到按此列排序的新数组,删除原有元素,再把新数组加入进表格;如果已经排序,则进行逆序处理。处理完毕后,用户点击表头即可实现排序和逆序。


首先请增加这样三个类:
SortTableMouseAdaptor类:用以排序的关键类。
public class SortTableMouseAdaptor extends MouseAdapter{
    
private JTable table;
    
    
public SortTableMouseAdaptor(JTable table){
        
this.table=table;
    }

    
    
public void mouseClicked(MouseEvent event) // check for double
        /*
         * if (event.getClickCount() < 2) return;
         
*/


        
// find column of click and
        int tableColumn = table.columnAtPoint(event.getPoint());

        
// translate to table model index and sort
        DefaultTableModel tableModel = (DefaultTableModel) table.getModel();

        
int rowCount = tableModel.getRowCount();
        
int cloumnCount = tableModel.getColumnCount();

        SortTableRow[] tableRowArr 
= new SortTableRow[rowCount];

        
int j;
        
for (int i = 0; i < rowCount; i++{
            tableRowArr[i] 
= new SortTableRow(cloumnCount, tableColumn);
            
            
for (j = 0; j < cloumnCount; j++{
                tableRowArr[i].setArrValue(j, tableModel.getValueAt(i,j));
            }

        }

        
        SortCompareColum compareColum
=new SortCompareColum(rowCount);
        
for (int i = 0; i < rowCount; i++{
            compareColum.setArrValue(i, tableModel.getValueAt(i,tableColumn));
        }

        
        tableModel.setRowCount(
0);
        Arrays.sort(tableRowArr);
        
        
if(compareColum.isSorted()){
            List ls
=Arrays.asList(tableRowArr);
            Collections.reverse(ls);
            
            
for (int i = 0; i < ls.size(); i++{
                SortTableRow tableRow
=(SortTableRow)ls.get(i);
                
                tableModel.addRow(tableRow.getArr());
            }

        }

        
else{                
            
for (int i = 0; i < tableRowArr.length; i++{
                tableModel.addRow(tableRowArr[i].getArr());
            }

        }


        
        table.invalidate();
    }

}

SortCompareColum类,可以作为SortTableMouseAdaptor类的内部类使用:
public class SortCompareColum{
    
private Object[] arr;
    
    
public SortCompareColum(int arrLength){
        arr 
= new Object[arrLength];
    }

    
    
public void setArrValue(int i, Object value) {
        arr[i] 
= value;
    }

    
    
public boolean isSorted(){
        
boolean retval=true;
        
        
for(int i=0;i<arr.length-1;i++){
            
            
try{
                
int op1 =Integer.valueOf((String) arr[i]);
                
int op2 = Integer.valueOf((String) arr[i+1]);
                
                retval
=retval && (op1-op2>0?false:true);
            }

            
catch(Exception e){
                String op1 
= (String) arr[i];
                String op2 
= (String) arr[i+1];
                
                retval
=retval && (op1.compareTo(op2)>0?false:true);
            }

        }

        
        
return retval;
    }

}


SortTableRow类,可以作为SortTableMouseAdaptor类的内部类使用:
public class SortTableRow implements Comparable {
    
private Object[] arr;

    
public int compareColumnIndex;

    
public SortTableRow(int arrLength, int compareColumnIndex) {
        arr 
= new Object[arrLength];
        ;
        
this.compareColumnIndex = compareColumnIndex;
    }


    
public void setArrValue(int i, Object value) {
        arr[i] 
= value;
    }


    
public int compareTo(Object other) {
        SortTableRow another 
= (SortTableRow) other;

        
try{            
            String op1 
= (String) this.getCompareObj();
            String op2 
= (String) another.getCompareObj();
            
int op3=Integer.valueOf(op1);
            
int op4=Integer.valueOf(op2);
            
            
return op3-op4;
        }

        
catch(Exception ex){
            String op1 
= (String) this.getCompareObj();
            String op2 
= (String) another.getCompareObj();
            
return op1.compareTo(op2);
        }
        
    }

    
    
public Object[] getArr() {
        
return arr;
    }


    
public Object getCompareObj() {
        
return arr[compareColumnIndex];
    }

}


使用时对需要排序的表格进行如下处理就行了,很简单方便:
table.getTableHeader().addMouseListener(new SortTableMouseAdaptor(table));

三个类打包下载在此,欢迎试用:
http://www.blogjava.net/Files/sitinspring/sortTable20070712105832.rar

posted on 2007-07-09 15:58 sitinspring 阅读(1641) 评论(2)  编辑  收藏 所属分类: Swing

评论

# re: 利用MouseAdapter来实现自排序的表格 2007-07-09 17:00 交口称赞

学习Java6(九)Table(1)排序表格
http://www.blogjava.net/vip01/archive/2007/05/14/117244.html


java6生成排序表格,推荐看下,算是打个广告
  回复  更多评论   

# re: 利用MouseAdapter来实现自排序的表格 2007-07-10 09:15 sitinspring

Jdk6的排序表格是不错,就是适用性窄一点,很多人还在1.4下,这时就得自己动手了.  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
sitinspring(http://www.blogjava.net)原创,转载请注明出处.