看起来您想要的是能够对表进行排序,然后能够添加更多行而不更改表排序顺序。即使有可能,您也必须重写DefaultRowSorter
and TableRowSorter
(两者都可用的源代码)。原因是当前实现旨在保持一致的排序顺序(不考虑何时添加行)。您可能无法扩展 TableRowSorter 来解决这个问题,因为它的父类有很多与我刚才描述的设计相关的私有函数。
我上面描述的是干净的方式。这是另一种方法,每次要插入新行时都这样做:
将视图的当前排序顺序保存在地图中。我使用 hashmap ( postion
) 将排序列的第 i 行中的每个对象映射到它在视图中的位置。 position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));
创建一个比较器,它将使用上面创建的映射对传入数据进行排序。将 TableRowSorter 的列比较器设置为新创建的比较器。然后调用sorter.sort()
,这是必要DefaultRowSorter
的,因为需要缓存比较器。比较器会将现有对象放在其当前位置,并将新对象(在插入期间创建)放在最后。
将行插入到表模型中。在我的代码中,我将 3 个随机整数、布尔值和双精度值添加到表中的 3 列中。
通过将 value 设置为 null 来删除 #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);
}
}