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、サイズ: java.util.ArrayList.RangeCheck(ArrayList.java:547) で 1、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) で javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) で 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

たとえば、2つの行があり、行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 に答える