用動作去驅動未來

          生命在于運動,讓自己身體的每一個細胞都動起來吧.

           

          java swt table 點擊表頭排序

          public class PickerShellTableSort {
              private Table table;
              private Image upImage;
              private Image downImage;
              
              private int[] sortFlags;
              private int[] sortColIndexes;
              
              public PickerShellTableSort(Table table) {
                  int[] sortCols = new int[table.getColumnCount()];
                  for (int i = 1; i < sortCols.length; i++) {
                      sortCols[i] = i;
                  }
                  
                  this.table = table;
                  this.sortColIndexes = sortCols;     //需要排序的索引
                  this.sortFlags = new int[table.getColumnCount()];
                  
                  init();
              }
              
              private void init() {
                  for (int i = 0; i < sortColIndexes.length; i++) {
                      final int sortColIndex = this.sortColIndexes[i];
                      TableColumn col = table.getColumn(sortColIndex);
                      
                      col.addListener(SWT.Selection, new Listener() {
                          public void handleEvent(Event event) {
                              columnHandleEvent(event, sortColIndex);
                          }
                      });
                  }
                  
                  this.upImage = FrameCommonActivator.getImageDescriptor("icons/up.gif").createImage();
                  this.downImage = FrameCommonActivator.getImageDescriptor("icons/down.gif").createImage();
              }
              
              private void columnHandleEvent(Event event, int sortColIndex) {
                  try {
                      for (int i = 0; i < sortColIndexes.length; i++) {
                          TableColumn tabCol = table.getColumn(i);
                          tabCol.setImage(null);
                      }
                      
                      boolean selectColumnType = this.isStringOrNumberType(sortColIndex);
                      
                       if (this.sortFlags[sortColIndex] == 1) {
                           clearSortFlags();
                          this.sortFlags[sortColIndex] = -1;
                          
                          if(selectColumnType) {
                              this.addNumberSorter(table.getColumn(sortColIndex), true);
                          } else {
                              this.addStringSorter(table.getColumn(sortColIndex), true);
                          }
                          
                          table.getColumn(sortColIndex).setImage(this.upImage);
                      } else {
                          this.sortFlags[sortColIndex] = 1;
                          
                          if(selectColumnType) {
                              this.addNumberSorter(table.getColumn(sortColIndex), false);
                          } else {
                              this.addStringSorter(table.getColumn(sortColIndex), false);
                          }
                          
                          table.getColumn(sortColIndex).setImage(this.downImage);
                      }
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
              
              /**
               * @param table
               * @param column
               * @param isAscend  
               */
              private void addStringSorter(TableColumn column,boolean isAscend) {
                  
                    Collator comparator = Collator.getInstance(Locale.getDefault());
                    int columnIndex = getColumnIndex(table, column);
                    TableItem[] items = table.getItems();
                    //使用冒泡法進行排序
                    for (int i = 1; i < items.length; i++) {
                        String str2value = items[i].getText(columnIndex);
                        if(str2value.equalsIgnoreCase("")){
                           //當遇到表格中的空項目時,就停止往下檢索排序項目
                           break;
                        }
                        for (int j = 0; j < i; j++) {
                           String str1value = items[j].getText(columnIndex);
                           boolean isLessThan = comparator.compare(str2value, str1value) < 0;     
                           if ((isAscend && isLessThan) || (!isAscend && !isLessThan)) {
                                String[] values = getTableItemText(table, items[i]);
                                Object obj = items[i].getData();
                                items[i].dispose();
                                TableItem item = new TableItem(table, SWT.NONE, j);
                                item.setText(values);
                                item.setData(obj);
                                items = table.getItems();
                                break;
                           }
                        }
                     }
                     table.setSortColumn(column);
                     table.setSortDirection((isAscend ? SWT.UP : SWT.DOWN));
                     isAscend = !isAscend;
                }
              
              
              private void addNumberSorter(TableColumn column,boolean isAscend) {
                  
                    int columnIndex = getColumnIndex(table, column);
                    TableItem[] items = table.getItems();
                    //使用冒泡法進行排序
                    for (int i = 1; i < items.length; i++) {
                     String strvalue2 = items[i].getText(columnIndex);
                     if(strvalue2.equalsIgnoreCase("")){
                      //當遇到表格中的空項目時,就停止往下檢索排序項目
                      break;
                     }
                     
                     for (int j = 0; j < i; j++) {
                      String strvalue1 = items[j].getText(columnIndex);
                      
                      //將字符串類型數據轉化為float類型
                      float numbervalue1=Float.valueOf(strvalue1);
                      float numbervalue2=Float.valueOf(strvalue2);
                      
                      boolean isLessThan =false;
                      if(numbervalue2<numbervalue1){
                          isLessThan =true;
                      }    
                      
                      if ((isAscend && isLessThan) || (!isAscend && !isLessThan)) {
                           String[] values = getTableItemText(table, items[i]);
                           Object obj = items[i].getData();
                           items[i].dispose();
                           TableItem item = new TableItem(table, SWT.NONE, j);
                           item.setText(values);
                           item.setData(obj);
                           items = table.getItems();
                           break;
                      }
                     }
                    }
                    
                    table.setSortColumn(column);
                    table.setSortDirection((isAscend ? SWT.UP : SWT.DOWN));
                    isAscend = !isAscend;
               }
              
              private  int getColumnIndex(Table table, TableColumn column) {
                  TableColumn[] columns = table.getColumns();
                  for (int i = 0; i < columns.length; i++) {
                      if (columns[i].equals(column))
                          return i;
                  }
                  return -1;
               }
              
              private  String[] getTableItemText(Table table, TableItem item) {
                  int count = table.getColumnCount();
                  String[] strs = new String[count];
                  for (int i = 0; i < count; i++) {
                      strs[i] = item.getText(i);
                  }
                  return strs;
               }

               private void clearSortFlags() {
                  for (int i = 0; i < table.getColumnCount(); i++) {
                      this.sortFlags[i] = 0;
                  }
               }
              
               /**
                * 判斷當前選中列的數據類型
                * @return
                */
               private boolean isStringOrNumberType(int selectColumnIndex) {
                   boolean isok = false ;
                  
                   TableItem[] items = table.getItems();
                   String[] str = new String[items.length];
                  
                   for (int i = 0; i < items.length; i++) {
                       str[i] = items[i].getText(selectColumnIndex);
                   }
                  
                   for (int i = 0; i < str.length; i++) {
                      String string = str[i];
                      isok = string.matches("^(-|\\+)?\\d+\\.?\\d*$");
                      //如果這一列中有一個是字符串,也按字符串排序
                      if(!isok) {
                          return isok;
                      }
                   }
                  
                   return isok ;
               }
              
          }

          posted on 2012-04-24 09:56 黑螞蟻 閱讀(2177) 評論(0)  編輯  收藏 所屬分類: SWT,JFACE

          導航

          統計

          公告

          路在腳下,此刻,出發。

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 邛崃市| 永新县| 涡阳县| 定日县| 饶平县| 阳江市| 宜川县| 密云县| 肃南| 锡林郭勒盟| 武功县| 博野县| 土默特左旗| 皮山县| 景宁| 河西区| 梁平县| 横峰县| 福鼎市| 安新县| 蒲城县| 西平县| 巴彦淖尔市| 阿拉尔市| 丁青县| 登封市| 沿河| 安远县| 措勤县| 金坛市| 丽江市| 洪泽县| 谷城县| 贵州省| 鄂伦春自治旗| 商南县| 房山区| 手游| 宁德市| 天台县| 醴陵市|