Удалить редактируемую строку из JTable - PullRequest
4 голосов
/ 15 июня 2011

У меня есть 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();
    }
}

Но если ячейка была в процессе редактирования, когда она (и / или ячейки над ним) были удалены, отредактированная ячейка осталась, в то время как остальные ушли, как это:

И затем попытка выйти из редактирования выкинула 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.

Так что мне все равно, решит ли решение исходную проблему - проблему дурацких результатов при удалении редактируемой ячейки - или эту новую проблему - проблемуgetEditingRow() не ведет себя так, как я ожидал, просто мне нужно, чтобы хотя бы один из них произошел.Тем не менее, мне было бы интересно услышать оба решения просто из академического любопытства.Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 15 июня 2011

Попробуйте добавить следующие строки перед удалением любых строк из вашей модели:

if (table.isEditing()) {
    table.getCellEditor().stopCellEditing();
}
1 голос
/ 15 июня 2011

Table Stop Editing имеет общее решение, которое удобно, когда у вас есть любое количество кнопок для поддержки.

0 голосов
/ 05 июля 2012

Как сказал Говард, необходимо остановить редактирование ячейки перед изменением модели. Но также необходимо проверить, действительно ли ячейка изменяется, чтобы избежать исключений нулевого указателя. Это связано с тем, что метод getCellEditor () вернет null , если таблица не редактируется в данный момент:

if (myTable.isEditing()) // Only if it's is being edited
         myTable.getCellEditor().stopCellEditing();
    ...

бывают случаи, когда редактор ячеек может отказаться от редактирования, это может произойти, т. е. если вы используете какой-то сложный редактор, который ожидает ввода данных пользователем в диалоге. В этом случае вы должны добавить дополнительную проверку:

if (myTable.isEditing()) 
   if (!myTable.getCellEditor().stopCellEditing()) {

     // If your update is user-generated:
     JOptionPane.showMessageDialog(null, "Please complete cell edition first.");

     // Either way return without doing the update.
     return;
   }

В вашем коде вы пытаетесь удалить только те строки, которые не редактируются, но это также вызовет исключение ArrayOutOfBounds, когда редактор ячеек прекратит редактирование. Лучше всего остановить его до обновления.

Наконец, в вашей таблице также есть свойство, которое вы можете установить:

 table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

как объяснено здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...