春風博客

          春天里,百花香...

          導航

          <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.aygfsteel.com/Files/sitinspring/sortTable20070712105832.rar

          posted on 2007-07-09 15:58 sitinspring 閱讀(1663) 評論(2)  編輯  收藏 所屬分類: Swing

          評論

          # re: 利用MouseAdapter來實現自排序的表格 2007-07-09 17:00 交口稱贊

          學習Java6(九)Table(1)排序表格
          http://www.aygfsteel.com/vip01/archive/2007/05/14/117244.html


          java6生成排序表格,推薦看下,算是打個廣告
            回復  更多評論   

          # re: 利用MouseAdapter來實現自排序的表格 2007-07-10 09:15 sitinspring

          Jdk6的排序表格是不錯,就是適用性窄一點,很多人還在1.4下,這時就得自己動手了.  回復  更多評論   

          sitinspring(http://www.aygfsteel.com)原創,轉載請注明出處.
          主站蜘蛛池模板: 正定县| 铜梁县| 吴堡县| 高邑县| 革吉县| 延寿县| 桐柏县| 洪雅县| 富蕴县| 兴海县| 青浦区| 海丰县| 巴塘县| 循化| 邵阳市| 黔西县| 洛阳市| 庆云县| 信丰县| 宿迁市| 阜城县| 兴海县| 上林县| 柳林县| 民乐县| 龙南县| 顺平县| 安仁县| 龙海市| 平利县| 林甸县| 乃东县| 阜新市| 剑河县| 库伦旗| 安徽省| 拉孜县| 阿拉尔市| 武邑县| 明水县| 南通市|