用動(dòng)作去驅(qū)動(dòng)未來

          生命在于運(yùn)動(dòng),讓自己身體的每一個(gè)細(xì)胞都動(dòng)起來吧.

           

          java swt table 點(diǎn)擊表頭排序

          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();
                    //使用冒泡法進(jìn)行排序
                    for (int i = 1; i < items.length; i++) {
                        String str2value = items[i].getText(columnIndex);
                        if(str2value.equalsIgnoreCase("")){
                           //當(dāng)遇到表格中的空項(xiàng)目時(shí),就停止往下檢索排序項(xiàng)目
                           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();
                    //使用冒泡法進(jìn)行排序
                    for (int i = 1; i < items.length; i++) {
                     String strvalue2 = items[i].getText(columnIndex);
                     if(strvalue2.equalsIgnoreCase("")){
                      //當(dāng)遇到表格中的空項(xiàng)目時(shí),就停止往下檢索排序項(xiàng)目
                      break;
                     }
                     
                     for (int j = 0; j < i; j++) {
                      String strvalue1 = items[j].getText(columnIndex);
                      
                      //將字符串類型數(shù)據(jù)轉(zhuǎn)化為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;
                  }
               }
              
               /**
                * 判斷當(dāng)前選中列的數(shù)據(jù)類型
                * @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*$");
                      //如果這一列中有一個(gè)是字符串,也按字符串排序
                      if(!isok) {
                          return isok;
                      }
                   }
                  
                   return isok ;
               }
              
          }

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

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          路在腳下,此刻,出發(fā)。

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 松潘县| 郎溪县| 鄯善县| 黑河市| 宣武区| 湟源县| 威海市| 南宫市| 沂南县| 梧州市| 基隆市| 丰城市| 泾源县| 乳源| 嘉义市| 镇安县| 金阳县| 公安县| 西安市| 武鸣县| 长沙县| 淮北市| 池州市| 河北省| 凤庆县| 孝感市| 北辰区| 九龙坡区| 瑞昌市| 札达县| 巩义市| 弥渡县| 垣曲县| 新泰市| 大港区| 武川县| 辽源市| 开鲁县| 浮山县| 铜陵市| 济宁市|