JTable removeRow(), удаление неправильной строки

#java #swing #jtable

#java #качать #jtable

Вопрос:

У меня есть JTable, и мне нужно удалить строку, а именно выбранную строку.

Итак, сначала я получаю модель таблицы :

     DefaultTableModel model = (DefaultTableModel) table.getModel();
  

Затем выбранная строка (если выбрана вторая строка, это возвращает 1, что понятно, потому что строки начинаются с нуля):

     int selectedRow = table.getSelectedRow();
  

Затем я пытаюсь удалить строку:

     model.removeRow(selectedRow);
  

Затем я снова устанавливаю модель таблицы:

     table.setModel(model);
  

Чего это достигает, так это удаления полностью случайной строки. Я просто не могу понять, почему. В какой-то момент я отсортировал таблицу, используя table.setRowSorter(сортировщик), но я не знаю, почему это должно быть проблемой. Если SSCCE абсолютно необходим, пожалуйста, дайте мне знать, потому что мне нужно изменить много кода, прежде чем я смогу его создать.

ПРИМЕЧАНИЕ: значения, возвращаемые этими двумя строками, отличаются:

     System.out.println(table.getValueAt(selectedRow, 1));
    System.out.println(model.getValueAt(selectedRow, 1));
  

Ответ №1:

Если JTable отфильтровано или отсортировано, вы можете преобразовать

 int modelRow = convertRowIndexToModel(row);
  

Комментарии:

1. Как обычно, коротко, лаконично и точно. Спасибо! 🙂

Ответ №2:

Возвращаемый индексом JTable.getSelectedRow является view индексом: это индекс строки, который конечный пользователь видит в таблице. Это не то же самое, что индекс модели, потому что, если вы сортируете таблицу, индексы в модели не меняются, но индексы в представлении меняются. Итак, вы всегда должны использовать JTable.convertRowIndexToModel для получения индекса модели из индекса представления.

Обратите внимание, что то же самое необходимо сделать для столбцов, потому что пользователь может изменить порядок столбцов по своему вкусу.

Кроме того, вам не нужно устанавливать модель заново каждый раз, когда вы удаляете строку. Вместо этого ваша модель должна запустить TableModelEvent, чтобы сообщить представлению об удалении. См AbstractTableModel.fireTableRowsDeleted .

Комментарии:

1. он использует DefaultTableModel , об этом не заботится, 1