好像你想要的是能夠對錶進行排序,最後是能夠在不表排序次序改變添加更多的行。儘管這是可能的,但您必須重寫DefaultRowSorter
和TableRowSorter
(可用於兩者的源代碼)。原因是當前實現的目的是保持一致的排序順序(不考慮何時添加行)。你可能無法擴展TableRowSorter來克服這個問題,因爲它的父類有很多與我剛剛描述的設計綁定的私有函數。
我上面描述的是乾淨的方式。這裏是另一種方式,你可以做到這一點,做到這一點,你要插入一個新行每次:
保存在地圖視圖當前的排序順序。我使用散列圖(postion
)將排序列的第i行中的每個對象映射到它在視圖中的位置。 position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));
創建一個比較器,它將使用上面創建的映射對輸入數據進行排序。將TableRowSorter的列比較器設置爲新創建的比較器。然後調用sorter.sort()
,這是必要的,因爲DefaultRowSorter
需要緩存比較器。比較器將把現有對象放在當前位置,並在結尾放置新對象(在插入過程中創建)。
將行插入到表模型中。在我的代碼中,我將3個隨機的Integer,Boolean和Double值添加到我的表中的3列。
通過將值設置爲空來移除#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);
}
}
感謝您的回答。我實際上很喜歡本地的rowsorter方法,因爲我可以在三態(升序,降序和未排序)中循環列狀態。如果使用Collections.sort,我將不得不創建一個變量來保存原始行順序,然後每次對它進行排序。 – user1429552
使用'setSortKeys(null)'指示視圖應該未排序;這與您的模型訂購無關。 – trashgod
這就是我用來圈定訂單狀態的東西。但是,在升序和降序模式下(未分類很好),重排行將被分揀機覆蓋。正如我所提到的,使用Collection.sort()將重新排序真實表模型,然後如果我想循環到原始順序,我將需要一些東西來存儲它在第一個地方。不知道是否有更好的解決方案。 – user1429552