JTable表头排序的两种方法

键词:JTable,表头排序,线程安全 

在Java6以前,关于JTable的表头排序是一件非常费力的事情,因为很多复杂的工作都要自己去做,但到了Java6,表头排序就变得非常简单了就一行代码:setRowSorter(new TableRowSorter<TableModel>(defaultTableModel));不过我经过实验,发现这个方法其实不怎么好用: 
1.速度比较慢,进行表头排序的时候,总觉得页面刷新有些迟缓。 
2.点击表头的响应速度太慢了。用比较快的速度点表头,很多时候页面根本不响应点击事件。 
3.表头的排序箭头是默认的,比较难看。 

造成以上问题的原因无非有两个,一个是TableRowSorter类比较新,没有进行优化,二是对TableRowSorter类认识不够。 

下面说一下Java5及一下版本中的表头排序 
Java5一下进行表头排序,必须要写很多的代码~~~,不过这样也有好处,就是式样和效率可以自己控制,所以自己写的表头排序比Java6默认的TableRowSorter好看很多,也快很多,这就复杂一些也是值得的,下面比较一下二者的表现差异。 
下图是java5的表头排序画面: 
 

下图是java6的表头排序画面: 
 
怎么样,我们根据ID排序,利用自己的表头排序样式好看一些,速度和相应明显比使用TableRowSorter好很多。 

Java5中完成表头排序的代码是比较多的也比较复杂,我想这也是为什么Java6对它进行包装的原因吧,我这里只列出构造函数的代码,更完整的代码见附件 
Java代码   收藏代码
  1. public ZTableJava5(TableModel dm) {  
  2.         super(dm, nullnull);  
  3.   
  4.         JTableHeader jtableheader = getTableHeader();  
  5.         jtableheader.addMouseListener(new MouseAdapter() {  
  6.             public void mouseClicked(MouseEvent event) {  
  7.                 if (event.getSource() == getTableHeader()) {  
  8.                     getTableHeader().removeMouseListener(this);  
  9.                     int i = columnAtPoint(event.getPoint());  
  10.                     int j = convertColumnIndexToModel(i);  
  11.   
  12.                     if (!columnIsSortable(j)) {  
  13.                         return;  
  14.                     }  
  15.                     if (j == sortColumn) {  
  16.                         ascending = !ascending;  
  17.                     } else {  
  18.                         ascending = true;  
  19.                         sortColumn = j;  
  20.                     }  
  21.   
  22.                     EventQueue.invokeLater(new Runnable() {  
  23.                         public void run() {  
  24.                             sort();  
  25.                         }  
  26.                     });  
  27.   
  28.                     getTableHeader().addMouseListener(this);  
  29.                 }  
  30.             }  
  31.         });  
  32.         jtableheader.setDefaultRenderer(createHeaderRenderer());  
  33.         if (getRowCount() > 0) {  
  34.             EventQueue.invokeLater(new Runnable() {  
  35.                 public void run() {  
  36.                     reinitialize();  
  37.                 }  
  38.             });  
  39.         }  
  40.         // setRowSorter(new TableRowSorter<TableModel>(defModel));  
  41.     }  

Java6中完成表头排序的代码非常简单: 
Java代码   收藏代码
  1. public ZTableJava6(TableModel dm) {  
  2.         super(dm, nullnull);  
  3.   
  4.         DefaultTableModel defModel = (DefaultTableModel) getModel();  
  5.         setRowSorter(new TableRowSorter<TableModel>(defModel));  
  6.     }  

你可能感兴趣的:(java,优化,工作,null)