2012-05-31 21 views
1

當表處於排序模式(使用RowSorter)時,表似乎大部分時間都是實時排序的。例如,每當添加新行時,表格都會自動排序(編輯單元格除外)。我想知道是否有任何方法來禁用這種實時排序行爲。JTable的非實時/非實時排序

我想要做的是:對錶格進行排序(升序或降序)後,排序器保持當前的排序狀態並停止實時排序。然後可以在底部添加新行,並且可以上下移動選定的行,並且該表更新視圖模型中的所有更改。

@trashgod:謝謝你的回答。我實際上很喜歡本地的rowsorter方法,因爲我可以在三態(升序,降序和未排序)中循環列狀態。如果使用Collections.sort,我將不得不創建一個變量來保存原始行順序,然後每次對它進行排序。

回答

2

您可以訂購的行你TableModel獨立使用Collections.sort()RowSorter的定製Comparator,如here所示的,可以接受一個參數,指定排序方向。

enum Sort { ASCENDING, DESCENDING; } 
class RecordComparator implements Comparator<Record> { 
    public RecordComparator(Sort sort, ...) { ... } 
} 
+0

感謝您的回答。我實際上很喜歡本地的rowsorter方法,因爲我可以在三態(升序,降序和未排序)中循環列狀態。如果使用Collections.sort,我將不得不創建一個變量來保存原始行順序,然後每次對它進行排序。 – user1429552

+0

使用'setSortKeys(null)'指示視圖應該未排序;這與您的模型訂購無關。 – trashgod

+0

這就是我用來圈定訂單狀態的東西。但是,在升序和降序模式下(未分類很好),重排行將被分揀機覆蓋。正如我所提到的,使用Collection.sort()將重新排序真實表模型,然後如果我想循環到原始順序,我將需要一些東西來存儲它在第一個地方。不知道是否有更好的解決方案。 – user1429552

0

好像你想要的是能夠對錶進行排序,最後是能夠在不表排序次序改變添加更多的行。儘管這是可能的,但您必須重寫DefaultRowSorterTableRowSorter(可用於兩者的源代碼)。原因是當前實現的目的是保持一致的排序順序(不考慮何時添加行)。你可能無法擴展TableRowSorter來克服這個問題,因爲它的父類有很多與我剛剛描述的設計綁定的私有函數。

我上面描述的是乾淨的方式。這裏是另一種方式,你可以做到這一點,做到這一點,你要插入一個新行每次:

  1. 保存在地圖視圖當前的排序順序。我使用散列圖(postion)將排序列的第i行中的每個對象映射到它在視圖中的位置。 position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));

  2. 創建一個比較器,它將使用上面創建的映射對輸入數據進行排序。將TableRowSorter的列比較器設置爲新創建的比較器。然後調用sorter.sort(),這是必要的,因爲DefaultRowSorter需要緩存比較器。比較器將把現有對象放在當前位置,並在結尾放置新對象(在插入過程中創建)。

  3. 將行插入到表模型中。在我的代碼中,我將3個隨機的Integer,Boolean和Double值添加到我的表中的3列。

  4. 通過將值設置爲空來移除#3中添加的比較器,sorter.setComparator(sortKeys.get(0).getColumn(), null);這樣下次排序在列上切換時,它將使用默認比較器而不是虛擬比較器。

完整代碼如下。它旨在每次按下按鈕時向表中添加一行。請注意我還沒有使用sortkeys> 1或過濾器測試過(我會把它留給你)。讓我知道你對這個黑客的看法。

private void insertRowButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    TableRowSorter<TableModel> sorter = (TableRowSorter<TableModel>)jTable1.getRowSorter(); 
    final HashMap<Object, Integer> position = new HashMap<Object, Integer>(); 
    List<? extends SortKey> sortKeys = sorter.getSortKeys(); 

    if(!sortKeys.isEmpty()){ 
     SortKey sortKey = sortKeys.get(0); 
     int column = sortKey.getColumn(); 
     TableModel tableModel = sorter.getModel(); 
     int n = sorter.getModelRowCount(); 
     final SortOrder sortOrder = sortKey.getSortOrder(); 
     for(int i=0;i<n;i++){ 
      position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i)); 
     } 
     //add dummy comparator 
     sorter.setComparator(column, new Comparator<Object>(){ 
      public int compare(Object o1, Object o2) { 
       int obj1Position = position.containsKey(o1) ? position.get(o1):position.size(); 
       int obj2Position = position.containsKey(o2) ? position.get(o2):position.size(); 
       return sortOrder == SortOrder.DESCENDING ? obj2Position - obj1Position:obj1Position - obj2Position; 
      } 
     }); 
     sorter.sort(); 
    } 

    /////////////insert row/////////////////// 
    DefaultTableModel tableModel = (DefaultTableModel)jTable1.getModel(); 
    tableModel.addRow(new Object[]{rand.nextInt(), rand.nextBoolean(), rand.nextDouble()}); 
    /////////////end insert row/////////////// 

    //remove dummy comparator 
    if(!sortKeys.isEmpty()){ 
     sorter.setComparator(sortKeys.get(0).getColumn(), null); 
    } 
}