JTable排序

说实话,这个JTable排序的方法真的是很经典,网上找了很多,也试了很多。网上很多的方法都很复杂,代码也很多。其实实现排序并不难,关键是不能和JTable上的任何操作有冲突。这个方法,不但不改变现有的Model,而且代码非常的简练。

刚得到它的时候,只能进行一个方向的排序,不能反向排序。于是,我修改了一下,把sun带的Arrays类中的方法改装了一下。这样就实现了双向的排序。好东西啊!!!

代码如下:

一共两个类SortManager、UpDownArrow。用法很简单,只要把你的JTable对象放到SortManager 对象的参数里就可以了,剩下的仔细看看就会明白的!

SortManager sortManager = new SortManager(JTable对象);

import  java.awt. * ;
import  java.awt.event. * ;
import  java.util. * ;
import  javax.swing. * ;
import  javax.swing.event. * ;
import  javax.swing.table. * ;
import  org.swing2cn.util. * ;

public   class  SortManager  implements  TableModelListener  {
    
final   static  Icon upIcon  =   new  UpDownArrow( 0 );
    
final   static  Icon downIcon  =   new  UpDownArrow( 1 );
    
private  JTable table;
    
private  TableModel dataModel;
    
private   int  sortColumn;
    
private  Row rows[];
    
private   boolean  ascending;
    
private   int  sortableColumns[];
    
public  SortManager(JTable jtable)  {
        rows 
=   null ;
        ascending 
=   true ;
        sortableColumns 
=   null ;
        table 
=  jtable;
        
int  i = 0 ;
        
int  length = jtable.getModel().getColumnCount();
        
final   int [] columns = new   int [length];
        
for (;i < length;i ++ ) {
            columns[i]
= i;
        }

        sortableColumns
= columns;
        initialize();
    }

    
public  SortManager(JTable jtable,  int  i)  {
        rows 
=   null ;
        ascending 
=   true ;
        sortableColumns 
=   null ;
        table 
=  jtable;
        sortColumn 
=  i;
        initialize();
    }

    
public  SortManager(JTable jtable,  int  ai[])  {
        
this (jtable, ai[ 0 ]);
        sortableColumns 
=  ( int []) ai.clone();
    }

    
public   void  initialize()  {
        dataModel 
=  table.getModel();
        ((AbstractTableModel) dataModel).addTableModelListener(
this );
        addMouseListener(table);
        JTableHeader jtableheader 
=  table.getTableHeader();
        jtableheader.setDefaultRenderer(createHeaderRenderer());
        
if  (table.getRowCount()  >   0 {
            reinitialize();
        }

    }

    
protected  TableCellRenderer createHeaderRenderer()  {
        DefaultTableCellRenderer defaultHeaderRenderer 
=   new  SortHeaderRenderer();
        defaultHeaderRenderer.setHorizontalAlignment(
0 );
        defaultHeaderRenderer.setHorizontalTextPosition(
2 );
        
return  defaultHeaderRenderer;
    }

    
public   void  reinitialize()  {
        rows 
=   null ;
        
if  (table.getRowCount()  >   0 {
            rows 
=   new  Row[table.getRowCount()];
            
for  ( int  i  =   0 ; i  <  rows.length; i ++ {
                rows[i] 
=   new  Row();
                rows[i].index 
=  i;
            }


            
if  (columnIsSortable(sortColumn))  {
                sort();
            }

        }

    }

    
private   boolean  columnIsSortable( int  i)  {
        
if  (rows  !=   null {
            
if  (sortableColumns  !=   null {
                
for  ( int  j  =   0 ; j  <  sortableColumns.length; j ++ {
                    
if  (i  ==  sortableColumns[j])  {
                        
return   true ;
                    }

                }


            }
  else   {
                
return   true ;
            }

        }

        
return   false ;
    }

    
public   void  addMouseListener( final  JTable table)  {
        table.getTableHeader().addMouseListener(
new  MouseAdapter()  {
            
public   void  mouseClicked(MouseEvent mouseevent)  {
                
int  i  =  table.columnAtPoint(mouseevent.getPoint());
                
int  j  =  table.convertColumnIndexToModel(i);
                
if  ( ! columnIsSortable(j))  {
                    
return ;
                }

                
if  (j  ==  sortColumn)  {
                    ascending 
=   ! ascending;
                }
  else   {
                    ascending 
=   true ;
                    sortColumn 
=  j;
                }

                sort();
            }

        }
);
    }

    
public   void  sort()  {
        
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 ;
        }

    }

    
public   void  resetData()  {
        Vector data
= new  Vector(dataModel.getRowCount());
        
int  i = 0 ;
        
for (;i < dataModel.getRowCount();i ++ ) {
            
int  j = 0 ;
            
final  Vector vv = new  Vector(dataModel.getColumnCount());
            
for (;j < dataModel.getColumnCount();j ++ ) {
                vv.add(dataModel.getValueAt(i,j));
            }

            data.add(vv);
        }

        i
= 0 ;
        
for (;i < rows.length;i ++ ) {
            
if (rows[i].index != i) {
                
int  j = 0 ;
                
final  Vector vv = (Vector)data.get(rows[i].index);
                
for (;j < dataModel.getColumnCount();j ++ ) {
                    dataModel.setValueAt(vv.get(j),i,j);
                }

            }

        }

    }

    
public   void  tableChanged(TableModelEvent tablemodelevent)  {
        reinitialize();
    }

    
private   class  SortHeaderRenderer  extends  DefaultTableCellRenderer  {
        
public  Component getTableCellRendererComponent(JTable jtable,
                Object obj, 
boolean  flag,  boolean  flag1,  int  i,  int  j)  {
            
if  (jtable  !=   null {
                JTableHeader jtableheader 
=  jtable.getTableHeader();
                
if  (jtableheader  !=   null {
                    setForeground(jtableheader.getForeground());
                    setBackground(jtableheader.getBackground());
                    setFont(jtableheader.getFont());
                }

            }

            setText(obj 
!=   null   ?  obj.toString() :  "" );
            
int  k  =  jtable.convertColumnIndexToModel(j);
            
if  (k  ==  sortColumn)  {
                setIcon(ascending 
?  SortManager.upIcon : SortManager.downIcon);
            }
  else   {
                setIcon(
null );
            }

            setBorder(UIManager.getBorder(
" TableHeader.cellBorder " ));
            
return   this ;
        }

    }

    
private   class  Row  implements  Comparable  {
        
private  Row()  {
        }

        
public   int  compareTo(Object obj)  {
            Row row 
=  (Row) obj;
            java.text.Collator cnCollator 
=  java.text.Collator.getInstance(Locale.getDefault());
            Object obj1 
=  dataModel.getValueAt(index, sortColumn);
            Object obj2 
=  dataModel.getValueAt(row.index, sortColumn);
            
if  (ascending)  {
             
if  ( ! (obj1  instanceof  Comparable))  {
                 
return   - 1 ;
             }

             
if  ( ! (obj2  instanceof  Comparable))  {
                 
return   1 ;
             }
  else   {
             }

         }

         
if  ( ! (obj1  instanceof  Comparable))  {
             
return   1 ;
         }

         
if  ( ! (obj2  instanceof  Comparable))  {
             
return   - 1 ;
         }
  else   {
                 
return  cnCollator.compare(obj2,obj1);
         }

        }

        
public   int  index;
    }

}

 

import  java.awt. * ;
import  javax.swing. * ;

public   class  UpDownArrow  implements  Icon  {
    
private    int  size  =   12 ;
    
public   static   final   int  UP  =   0 ;
    
public   static   final   int  DOWN  =   1 ;
    
private   int  direction;
    
public  UpDownArrow( int  i)  {
        direction 
=  i;
    }

    
public   int  getIconHeight()  {
        
return  size;
    }

    
public   int  getIconWidth()  {
        
return  size;
    }

    
public   void  paintIcon(Component component, Graphics g,  int  i,  int  j)  {
        
int  k  =  i  +  size  /   2 ;
        
int  l  =  i  +   1 ;
        
int  i1  =  (i  +  size)  -   2 ;
        
int  j1  =  j  +   1 ;
        
int  k1  =  (j  +  size)  -   2 ;
        Color color 
=  (Color) UIManager.get( " controlDkShadow " );
        
if  (direction  ==   0 {
            g.setColor(Color.white);
            g.drawLine(l, k1, i1, k1);
            g.drawLine(i1, k1, k, j1);
            g.setColor(color);
            g.drawLine(l, k1, k, j1);
        }
  else   {
            g.setColor(color);
            g.drawLine(l, j1, i1, j1);
            g.drawLine(l, j1, k, k1);
            g.setColor(Color.white);
            g.drawLine(i1, j1, k, k1);
        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值