2011-03-29 22 views

回答

14

在BasicTableHeaderUI中實現了鼠標單擊到更改排序狀態的映射,並且僅通過RowSorter的toggleSortOrder(columnIndex)實現。它的默認行爲是切換

UNSORTED - > ASCENDING - > DESCENDING - > ASCENDING -

就是沒辦法回UNSORTED。如果要求是簡單地擴大圓分成:

UNSORTED - > ASCENDING - > DESCENDING - UNSORTED - > ASCENDING -

要走的路是繼承TableRowSorter還並相應地覆蓋其toggleSortOrder

/** 
    * @inherited <p> 
    */ 
    @Override 
    public void toggleSortOrder(int column) { 
     List<? extends SortKey> sortKeys = getSortKeys(); 
     if (sortKeys.size() > 0) { 
      if (sortKeys.get(0).getSortOrder() == SortOrder.DESCENDING) { 
       setSortKeys(null); 
       return; 
      } 
     } 
     super.toggleSortOrder(column); 
    } 

注意:這有點簡化,因爲它沒有考慮n元排序的列,請參見完整版本的SwingX DefaultSortController。或者使用SwingX下手,其JXTable有API來配置排序週期就像

table.setSortOrderCycle(ASCENDING, DESCENDING, UNSORTED); 

乾杯 珍

+0

請注意,自行設置行排序器意味着您不必再調用setAutoCreateRowSorter()。如果仍然調用它,它將覆蓋您添加的RowSorter。 – awmross 2015-07-18 09:18:42

0

由於內置的​​排序機制只允許您升序或降序排列,因此如果您在JTable附近的某處提供了外部重新加載JButton,您可以返回到原始狀態,只需將相同的模型設置回當你在任何分類活動發生之前第一次顯示錶格。

-1

如果您正在尋找使用它的UI方式 - 在列標題上按住shift鍵點擊即可。這是內置的JTable功能

+0

我嘗試過,但沒有奏效。也許它是依賴於平臺的,我正在使用Linux。 – JooMing 2011-03-29 20:36:17

+0

對不起。它只適用於SwingX庫提供的JXTable。純粹的JTable沒有這個功能。但我會想象它可以通過刪除RowSorter來實現 - 它將關閉排序,有效地恢復原始排序順序 – 2011-03-29 20:38:21

+0

JXTable(嚴格來說,JXTableHeader)不再支持全部重置 - 在切換目標時在版本1.6中丟棄JDK6。 – kleopatra 2011-03-30 09:12:49

3

如果您使用的是DefaultRowSorter:「一個空的sortKeys列表表明該視圖應[未]排序,與模型相同。」

RowSorter rs = table.getRowSorter(); 
rs.setSortKeys(null); 

附錄:請注意,「null是指定一個空列表的簡寫」中setSortKeys()

3

此代碼實現循環ASCENDING-> DESCENDING-> UNSORTED - > ...沒有覆蓋TableRowSorter還:

TableRowSorter sorter = new TableRowSorter(getModel()); 
setRowSorter(sorter); 
// Remove default sort MouseListener 
for (MouseListener mouseListener : getTableHeader().getMouseListeners()) { 
    if (mouseListener instanceof javax.swing.plaf.basic.BasicTableHeaderUI.MouseInputHandler) { 
     getTableHeader().removeMouseListener(mouseListener); 
    } 
} 
// Add MouseListener for onClick event 
getTableHeader().addMouseListener(new MouseAdapter() { 
    private SortOrder currentOrder = SortOrder.UNSORTED; 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     int column = getTableHeader().columnAtPoint(e.getPoint()); 
     RowSorter sorter = getRowSorter(); 
     List sortKeys = new ArrayList(); 
     switch (currentOrder) { 
      case UNSORTED: 
       sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.ASCENDING)); 
       break; 
      case ASCENDING: 
       sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.DESCENDING)); 
       break; 
      case DESCENDING: 
       sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.UNSORTED)); 
       break; 
     } 
     sorter.setSortKeys(sortKeys); 
    } 
}); 
1

Kornell的答案是爲我工作的偉大(!感謝)

我做了這些改變可能使他人有所幫助:

  1. 將列從視圖轉換爲模型座標。這是原創中的一個錯誤。
  2. 忽略刪除其他鼠標偵聽器,因爲這樣做會禁用列拖動和調整大小。
  3. 篩選出除左鍵點擊以外的任何內容
  4. 只要列更改,重新初始化排序順序。用戶體驗以這種方式顯着更直觀,因爲您可以連續點擊不同的列並每次升序。

    TableRowSorter sorter = new TableRowSorter(getModel()); 
    setRowSorter(sorter); 
    getTableHeader().addMouseListener(new MouseAdapter() { 
        private SortOrder currentOrder = SortOrder.UNSORTED; 
        private int   lastCol   = -1; 
    
        @Override 
        public void mouseClicked(MouseEvent e) { 
         int column = getTableHeader().columnAtPoint(e.getPoint()); 
         column = convertColumnIndexToModel(column); 
         if (column != lastCol) { 
          currentOrder = SortOrder.UNSORTED; 
          lastCol = column; 
         } 
         RowSorter<?> sorter = getRowSorter(); 
         List<SortKey> sortKeys = new ArrayList<SortKey>(); 
         if (e.getButton() == MouseEvent.BUTTON1) { 
          switch (currentOrder) { 
           case UNSORTED: 
            sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.ASCENDING)); 
           break; 
           case ASCENDING: 
            sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.DESCENDING)); 
           break; 
           case DESCENDING: 
            sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.UNSORTED)); 
           break; 
          } 
          sorter.setSortKeys(sortKeys); 
         } 
        } 
    }); 
    
相關問題