gpt4 book ai didi

java - 对 Jtable 中的行进行排序时出错

转载 作者:行者123 更新时间:2023-12-02 06:36:26 24 4
gpt4 key购买 nike

我正在尝试在 Jtable 上设置 RowSorter,我使用方法 setAutoCreateRowSorter(Boolean b) 对行进行排序

table.setAutoCreateRowSorter(true);

但是当我将表格设置为 rawSorted 时,我收到一个奇怪的错误!

当我想删除一行时,冲突是可见的,我使用了 fireTableRowsDeleted()

int raw = table.getSelectedRow();  // the index of raw that i want to delete it
System.out.println(raw);
model.delte_raw(raw); // model is my table model

public void delte_raw(int raw)
{
if (!ls.isEmpty()) {
this.fireTableRowsDeleted(raw+1, raw);
ls.remove(raw);
}

我想向您展示在两种情况下返回上述代码的结果:

情况1:

当我将表设置为未原始排序时:

table.setAutoCreateRowSorter(false);

当我删除一行时,一切都会成功。

情况2:

当我将表格设置为原始排序时:

table.setAutoCreateRowSorter(true);

当我删除一行时,出现如下错误:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.checkAgainstModel(DefaultRowSorter.java:921)
at javax.swing.DefaultRowSorter.rowsDeleted(DefaultRowSorter.java:878)
at javax.swing.JTable.notifySorter(JTable.java:4277)
at javax.swing.JTable.sortedTableChanged(JTable.java:4121)
at javax.swing.JTable.tableChanged(JTable.java:4398)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:296)
at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTableModel.java:261)

我认为错误出在我的 defaultRowSorter 中,因此我定义了特定的 cellRenderer 如下:

//    final TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
//TableCellRenderer wrapper = new TableCellRenderer() {
// private Icon ascendingIcon = new ImageIcon("images/e.png");
// private Icon descendingIcon = new ImageIcon("images/e.png");
//
// @Override
// public Component getTableCellRendererComponent(JTable table,
// Object value, boolean isSelected, boolean hasFocus,
// int row, int column)
// {
// Component comp = r.getTableCellRendererComponent(table, value, isSelected,
// hasFocus, row, column);
// if (comp instanceof JLabel) {
// JLabel label = (JLabel) comp;
// label.setIcon(getSortIcon(table, column));
// }
// return comp;
// }
//
// /**
// * Implements the logic to choose the appropriate icon.
// */
// private Icon getSortIcon(JTable table, int column) {
// SortOrder sortOrder = getColumnSortOrder(table, column);
// if (SortOrder.UNSORTED == sortOrder) {
// return null;
// }
// return SortOrder.ASCENDING == sortOrder ? ascendingIcon : descendingIcon;
// }
//
// private SortOrder getColumnSortOrder(JTable table, int column) {
// if (table == null || table.getRowSorter() == null) {
// return SortOrder.UNSORTED;
// }
// List<? extends RowSorter.SortKey> keys = table.getRowSorter().getSortKeys();
// if (keys.size() > 0) {
// RowSorter.SortKey key = keys.get(0);
// if (key.getColumn() == table.convertColumnIndexToModel(column)) {
// return key.getSortOrder();
// }
// }
// return SortOrder.UNSORTED;
// }
//
//};
//table.getTableHeader().setDefaultRenderer(wrapper);

但是,同样的错误!

为什么我会收到此错误?我用谷歌搜索了很多,但要么我使用了错误的关键字,要么互联网上没有简单的解决方案。

最佳答案

在您的表模型中:

public void delte_raw(int raw) {
if (!ls.isEmpty()) {
this.fireTableRowsDeleted(raw+1, raw); // why raw+1 ???
ls.remove(raw);
}
}

当您的表模型从 AbstractTableModel 扩展并查看 fireTableRowsDeleted(int firstRow, int lastRow) javadoc:

Notifies all listeners that rows in the range [firstRow, lastRow], inclusive, have been deleted.

所以应该是:

public void delte_raw(int raw) {
if (!ls.isEmpty()) {
ls.remove(raw); // remove the row index from the List and then fire the event
fireTableRowsDeleted(raw, raw);
}
}

了解异常来源:查看DefaultRowSorter.checkAgainstModel(int firstRow, int endRow)实现:

private void checkAgainstModel(int firstRow, int endRow) {
if (firstRow > endRow || firstRow < 0 || endRow < 0 ||
firstRow > modelRowCount) {
throw new IndexOutOfBoundsException("Invalid range");
}
}

如您所见,使用 [raw+1,raw] 范围调用此方法会导致 IndexOutOfBoundsException

编辑

正如 @mKorbel 巧妙指出的那样,我完全忽略了这一点:

int raw = table.getSelectedRow();  // this is the index in the view
model.delte_raw(raw); // convert raw in the right model index is needed

您需要在正确的模型索引中转换raw。否则,它可能会导致副作用,因为在排序表中, View 中选定的索引很可能与其相关模型的索引不同:

int raw = table.getSelectedRow();  // this is the index in the view
model.delte_raw(table.convertRowIndexToModel(raw)); // perfect

参见JTable.convertRowIndexToModel(int viewRowIndex)

关于java - 对 Jtable 中的行进行排序时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com