当一个表处于排序模式(使用RowSorter)时,似乎大部分时间该表都是实时排序的。例如,每当我添加新行时,表格都会自动排序(编辑单元格除外)。我想知道是否有任何方法可以禁用这种实时排序行为。
我想要做的是:在对表进行排序后,无论是升序还是降序,排序程序都会保持当前排序状态并停止实时排序。然后,可以在底部添加新的行,并且可以上下移动选定的行,并且表会更新视图模型中的所有更改。
@垃圾神:感谢您的回复。我实际上有点喜欢原生的rowsorter方法,因为我可以在三态(升序、降序和未排序)中循环列状态。如果使用Collections.sort,在每次排序之前,我必须创建一个变量来保存原始的行顺序。
发布于 2012-06-01 07:27:52
您可以使用Collections.sort()和自定义Comparator对RowSorter中的行进行排序,该Comparator可以接受指定排序方向的参数,如所示的here。
enum Sort { ASCENDING, DESCENDING; }
class RecordComparator implements Comparator<Record> {
public RecordComparator(Sort sort, ...) { ... }
}发布于 2012-06-01 16:23:56
看起来您想要的是能够对表进行排序,然后能够在不改变表排序顺序的情况下添加更多行。即使这是可能的,你也必须重写DefaultRowSorter和TableRowSorter (两者都有源码)。原因是当前的实现被设计成保持一致的排序顺序(没有考虑何时添加行)。您可能无法扩展TableRowSorter来解决这个问题,因为它的父类有很多与我刚才描述的设计相关的私有函数。
我上面描述的是干净的方法。这是另一种你可以做到的方法,每次你想要插入一个新行时都可以这样做:
postion)将排序列的第i行中的每个对象映射到它在视图中的位置。position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));sorter.sort(),这是必要的,因为DefaultRowSorter需要缓存比较器。比较器将现有对象放在其当前位置,并将新对象(在插入过程中创建)放在末尾。通过将value设置为null在#3中添加了比较器,这样下次在列上切换排序时,它将使用默认比较器而不是虚拟比较器。
完整的代码如下。它用于在每次按下按钮时向表中添加一行。请注意,我还没有用sortkey>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);
}
}https://stackoverflow.com/questions/10842290
复制相似问题