【问题标题】:How do I get an updated post-sort TableModel?如何获得更新的排序后 TableModel?
【发布时间】:2011-07-07 19:17:31
【问题描述】:

我有一个使用setAutoCreateRowSorter(true) 的JTable 和一个附加的RowSorterListener,如下所示,因为我需要在我的应用程序的其他地方对某种JTable 执行一些操作。

我发现每当我单击列标题进行排序时,JTable 都会以正确的顺序重新显示行并调用侦听器,但我拉出的 TableModel 始终是原始的预排序表模型。

table.getRowSorter().addRowSorterListener(new RowSorterListener() {
  @Override
  public void sorterChanged(RowSorterEvent rsevent) {
    rsevent.getSource().getModel(); // Nope, original ordering here
    table.getModel(); // Same thing
  }
};

我如何获得行的新排序后排序,就像现在在 JTable 中显示的那样?

【问题讨论】:

  • 如何在 JTable 中初始化 RowSorter?这是我在 DefaultRowSorter 上注意到的一条评论:“DefaultRowSorter 是一个抽象类。具体的子类必须通过调用 setModelWrapper 来提供对底层数据的访问。setModelWrapper 方法必须在调用构造函数后立即调用,最好是从子类的构造函数中调用。未定义的行为如果您使用 DefaultRowSorter 而不指定 ModelWrapper 将产生结果"
  • 我认为您可以使用 table.convertRowIndexToModel(int ...),但是我认为有更好的解决方案。
  • 除了table.setAutoCreateRowSorter(true),我什么也没做。根据 Oracle 的 JTables 教程:“此操作定义了一个行排序器,它是 javax.swing.table.TableRowSorter 的一个实例。”所以我认为我根本不需要手动初始化它?
  • @Lazy 如果您第二条评论中的方法有效,请发布作为答案!即使有“更好的解决方案”,所有有效的解决方案都应该是答案,“更好”可以通过投票来判断。

标签: java swing sorting jtable


【解决方案1】:

我认为您可以使用 table.convertRowIndexToModel(int ...),但是我认为有更好的解决方案。

如果您定义自己的快速查找的 convertRowIndexToModel()(可能通过映射,O(1)),那么该解决方案就足够了。如果是 O(n),那么这就是需要解决的问题。

只需遍历行的循环,转换每一行并使用生成的索引进行查找。

以下是 TableSorter 中值得关注的 2 个方法:

 private Row[] getViewToModel() {

    if (viewToModel == null) {
        int tableModelRowCount = tableModel.getRowCount();

        viewToModel = new Row[tableModelRowCount];

        for (int row = 0; row < tableModelRowCount; row++) {
            viewToModel[row] = new Row(row);
        }

        if (isSorting()) {
            Arrays.sort(viewToModel);
        }
    }

    return viewToModel;
}

和:

private int[] getModelToView() {

    if (modelToView == null) {
        int n = getViewToModel().length;

        modelToView = new int[n];

        for (int i = 0; i < n; i++) {
            modelToView[modelIndex(i)] = i;
        }
    }

    return modelToView;
}

【讨论】:

    【解决方案2】:

    TableModel 中的数据永远不会改变,只有数据的视图会改变。

    如果您希望模型中的数据按照表格中显示的顺序显示,那么您只需使用:

    table.getValueAt(row, column);
    

    换句话说,您需要遍历所有行和列,以获取当前查看顺序的数据。

    【讨论】:

    • +1 这是区分modelview的一个很好的例子。
    【解决方案3】:

    嗨,我知道这是一个很晚的答案,但我尝试了@LazyCubicleMonkey 评论中使用的代码,它确实有效,这是我在对 jTable 进行排序时获取行的代码。

    DefaultTableModel search_model = (DefaultTableModel) jTable.getModel();
    search_model.removeRow(jTable.convertRowIndexToModel(row));
    jTable.setModel = (search_model)
    

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2021-07-26
      • 2019-02-22
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多