我有一个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中?
答案 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)