JTable removeRow (), удаление неправильной строки - PullRequest
1 голос
/ 02 октября 2011

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

Ответы [ 2 ]

11 голосов
/ 02 октября 2011

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

int modelRow = convertRowIndexToModel(row);
4 голосов
/ 02 октября 2011

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

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

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

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