春風博客

          春天里,百花香...

          導航

          <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 閱讀(1662) 評論(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)原創,轉載請注明出處.
          主站蜘蛛池模板: 新沂市| 易门县| 长沙县| 杭锦旗| 嘉荫县| 肇庆市| 玉树县| 桐柏县| 九龙城区| 慈利县| 翁牛特旗| 涡阳县| 古田县| 惠州市| 曲阜市| 仲巴县| 大竹县| 娄底市| 柳林县| 张家口市| 黔东| 桑植县| 辽宁省| 屯留县| 贵定县| 连江县| 黔西| 沁阳市| 屏边| 含山县| 裕民县| 松阳县| 永靖县| 乌海市| 当阳市| 茶陵县| 宜章县| 枣阳市| 喜德县| 盐池县| 察雅县|