为什么我不能删除我的jtable中的单元格

时间:2012-11-07 23:12:17

标签: java swing jtable

参见我的方法

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

这是错误callstack

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

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

2 个答案:

答案 0 :(得分:2)

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

for (int i = selectedRow.length - 1; i >= 0; i--) {
   data.removeRow(selectedRow[i]);
}

答案 1 :(得分:1)

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

所以,例如,如果我有两行,我想删除行0&amp; 1,我删除第0行的那一刻,第1行不再存在(它变为0)

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

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

您应该只需使用List#removeAlldata列表中删除要删除的行

data.removeAll(toDelete);