首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTable的非实时/非实时排序

JTable的非实时/非实时排序
EN

Stack Overflow用户
提问于 2012-06-01 06:46:30
回答 2查看 649关注 0票数 1

当一个表处于排序模式(使用RowSorter)时,似乎大部分时间该表都是实时排序的。例如,每当我添加新行时,表格都会自动排序(编辑单元格除外)。我想知道是否有任何方法可以禁用这种实时排序行为。

我想要做的是:在对表进行排序后,无论是升序还是降序,排序程序都会保持当前排序状态并停止实时排序。然后,可以在底部添加新的行,并且可以上下移动选定的行,并且表会更新视图模型中的所有更改。

@垃圾神:感谢您的回复。我实际上有点喜欢原生的rowsorter方法,因为我可以在三态(升序、降序和未排序)中循环列状态。如果使用Collections.sort,在每次排序之前,我必须创建一个变量来保存原始的行顺序。

EN

回答 2

Stack Overflow用户

发布于 2012-06-01 07:27:52

您可以使用Collections.sort()和自定义ComparatorRowSorter中的行进行排序,该Comparator可以接受指定排序方向的参数,如所示的here

代码语言:javascript
复制
enum Sort { ASCENDING, DESCENDING; }
class RecordComparator implements Comparator<Record> {
    public RecordComparator(Sort sort, ...) { ... }
}
票数 2
EN

Stack Overflow用户

发布于 2012-06-01 16:23:56

看起来您想要的是能够对表进行排序,然后能够在不改变表排序顺序的情况下添加更多行。即使这是可能的,你也必须重写DefaultRowSorterTableRowSorter (两者都有源码)。原因是当前的实现被设计成保持一致的排序顺序(没有考虑何时添加行)。您可能无法扩展TableRowSorter来解决这个问题,因为它的父类有很多与我刚才描述的设计相关的私有函数。

我上面描述的是干净的方法。这是另一种你可以做到的方法,每次你想要插入一个新行时都可以这样做:

  1. 在映射中保存视图的当前排序顺序。我使用散列映射(postion)将排序列的第i行中的每个对象映射到它在视图中的位置。position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));
  2. Create是一个比较器,它将使用上面创建的映射对传入数据进行排序。将TableRowSorter的列比较器设置为新创建的比较器。然后调用sorter.sort(),这是必要的,因为DefaultRowSorter需要缓存比较器。比较器将现有对象放在其当前位置,并将新对象(在插入过程中创建)放在末尾。
  3. 将行插入到表模型中。在我的代码中,我将3个随机整数、布尔值和双精度值添加到我的table.
  4. Remove中的3列中。

通过将value设置为null在#3中添加了比较器,这样下次在列上切换排序时,它将使用默认比较器而不是虚拟比较器。

完整的代码如下。它用于在每次按下按钮时向表中添加一行。请注意,我还没有用sortkey>1或者过滤器测试过这个(我会把这个留给你)。让我知道你对这个黑客的看法。

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10842290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档