У меня есть JTable и рядом с ним кнопка, которая вызывает deleteSelectedRows()
, что в точности соответствует звучанию:
public void deleteSelectedRows() {
int[] selected = jTable.getSelectedRows();
for(int i = selected.length - 1; i >= 0; i--) {
model.removeRow(selected[i]);
}
if(model.getRowCount() < 1) {
addEmptyRow();
}
}
Но если ячейка была в процессе редактирования, когда она (и / или ячейки над ним) были удалены, отредактированная ячейка осталась, в то время как остальные ушли, как это:
![](https://i.stack.imgur.com/cp6US.png)
И затем попытка выйти из редактирования выкинула ArrayIndexOutOfBoundsException
поскольку к строке 5 пытались получить доступ, и в таблице осталась только одна строка.
Затем я попробовал все виды развлечений и игр с jTable.getEditingRow()
.Сначала добавление if(selected[i] != editing)
до удаления, казалось, сработало, но затем удаление строк над отредактированной ячейкой вызывало проблемы.
Затем я попытался это сделать:
public void deleteSelectedRows() {
int[] selected = jTable.getSelectedRows();
int editing = jTable.getEditingRow();
for(int s : selected) { //PS: Is there a better way of doing a linear search?
if(s == editing) {
return;
}
}
for(int i = selected.length - 1; i >= 0; i--) {
model.removeRow(selected[i]);
}
if(model.getRowCount() < 1) {
addEmptyRow();
}
}
Но это не 'ничего не удаляю никогда.Судя по println
s, которые я разбросал вокруг, последняя выделенная ячейка (со специальной границей, видимой здесь на spam
) считается частью строки редактирования и, таким образом, запускает мою раннюю return
.
![](https://i.stack.imgur.com/dB85J.png)
Так что мне все равно, решит ли решение исходную проблему - проблему дурацких результатов при удалении редактируемой ячейки - или эту новую проблему - проблемуgetEditingRow()
не ведет себя так, как я ожидал, просто мне нужно, чтобы хотя бы один из них произошел.Тем не менее, мне было бы интересно услышать оба решения просто из академического любопытства.Заранее спасибо.