用動作去驅動未來

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

           

          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 黑螞蟻 閱讀(2172) 評論(0)  編輯  收藏 所屬分類: SWT,JFACE

          導航

          統計

          公告

          路在腳下,此刻,出發。

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 射洪县| 柳州市| 陵水| 三亚市| 吴旗县| 通化县| 泸西县| 含山县| 杂多县| 沁水县| 兖州市| 九龙城区| 呼伦贝尔市| 衡南县| 邵阳县| 揭阳市| 固原市| 通道| 合水县| 武定县| 抚松县| 河西区| 莎车县| 濉溪县| 元江| 安仁县| 丰都县| 灵丘县| 东明县| 茌平县| 尚义县| 平昌县| 建瓯市| 浠水县| 岑巩县| 祁连县| 永寿县| 綦江县| 太湖县| 太谷县| 巴里|