0

看我的方法

public void removeRow(int[] selectedRow) {
    int len = selectedRow.length;
    for(int i=0; i<len; i++) {
        data.remove(selectedRow[i]);
    }
    fireTableDataChanged();
}

这是错误调用堆栈

线程“AWT-EventQueue-0”中的异常 java.lang.IndexOutOfBoundsException:索引:1,大小:1 在 java.util.ArrayList.RangeCheck(ArrayList.java:547) 在 java.util.ArrayList.remove(ArrayList.java :387) 在 table.MyTableModel.removeRow(MyTableModel.java:89) 在 table.Tables$2.actionPerformed(Tables.java:61) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 在 javax.swing。 AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

我使用静态 ArrayList 数据作为数据持有者

4

2 回答 2

2

问题是,当您删除一行时,您的表索引会在每次删除时调整/减少,从而导致IndexOutOfBoundsException. 您可以以相反的顺序删除行以防止出现这种情况:

for (int i = selectedRow.length - 1; i >= 0; i--) {
   data.removeRow(selectedRow[i]);
}
于 2012-11-07T23:22:49.270 回答
1

问题是,一旦删除一行,selectedRow索引就不再与data列表中的行匹配

因此,例如,如果我有两行并且我想删除第 0 行和第 1 行,那么当我删除第 0 行时,第 1 行不再存在(它变为 0)

您需要做的是创建一个临时列表,其中包含您实际要删除的行...

List<MyRowData> toDelete = new ArrayList<MyRowData>(selectedRow.length);
for(int index : selectedRow) {
    toDelete.add(data.get(index));
}

您应该能够简单地用于从列表List#removeAll中删除要删除的行data

data.removeAll(toDelete);
于 2012-11-07T23:29:11.037 回答