如何获得更新的排序后的TableModel?

时间:2011-03-03 04:57:07

标签: java swing sorting jtable

我有一个JTable使用setAutoCreateRowSorter(true)和一个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中?

3 个答案:

答案 0 :(得分:4)

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

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

table.getValueAt(row, column);

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

答案 1 :(得分:1)

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

如果您定义自己的convertRowIndexToModel(),这是一个快速查找(可能通过地图,O(1)),该解决方案应该足够了。如果它是O(n),则需要修复它。

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

这是TableSorter中应该感兴趣的两种方法:

 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 :(得分:0)

嗨,我知道这是一个非常晚的答案,但我尝试了@LazyCubicleMonkey注释中使用的代码,它确实在我的代码中获取jTable排序时的行。

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