У меня возникла проблема с получением данных при выборе строки из JTable. Это происходит всякий раз, когда я включаю setAutoCreateRowSorter(true) таблицы. Пока вот что я сделал:
private void displayBooks(){
bookTable.setAutoCreateRowSorter(true);
bookTable.getTableHeader().setFont(new java.awt.Font("Century Gothic", 1, 14));
dtm = (DefaultTableModel) bookTable.getModel();
clearTable(dtm);
for(Book book: books){
dtm.addRow(new Object[]{book.getId(), ...//rest of the code
}
}
По методу bookTableMouseClicked я сделал вот что:
...
if (bookTable.getSelectedRow() >= 0){
Book book = books.get(bookTable.getSelectedRow());
setBook(book);
}...
Когда я щелкнул таблицу заголовков, чтобы отсортировать данные, у меня появились неоднозначные данные.




Выбранный номер строки в экземпляре JTable всегда является выбранным номером строки на стороне обзора.
Если вы активируете сортировщики рядов, они больше не будут соответствовать номеру ряда на стороне модели.
Для преобразования между этими двумя номерами строк JTable предлагает методы преобразования из «индекса строки просмотра» в «индекс строки модели» и наоборот. Эти методы называются convertRowIndexToModel и convertRowIndexToView.
В обработчике mouseClicked вам нужно вызвать функцию convertRowIndexToModel следующим образом:
if (bookTable.getSelectedRow() >= 0){
Book book = books.get(bookTable.convertRowIndexToModel(bookTable.getSelectedRow()));
setBook(book);
}
Проблема в том, что вы храните данные в двух местах:
Данные должны храниться только в TableModel. Таким образом, вам не нужно беспокоиться о синхронизации данных, поскольку они находятся только в одном месте.
Вы можете просто создать объект Book из выбранной строки, используя метод getValueAt (..) JTable. Вам нужно будет вызвать этот метод для каждого столбца в таблице.
Или другой подход - создать настраиваемую TableModel, которая содержит объекты Book, тогда вы можете просто получить объект Book прямо из таблицы. Это немного больше работы, но это лучший подход.
Ознакомьтесь с Модель таблицы строк для пошагового подхода к созданию настраиваемой модели TableModel для настраиваемого объекта.
Большое спасибо, сэр. Это действительно помогает.