Как получить данные в JTable при использовании RowSorter?

У меня возникла проблема с получением данных при выборе строки из 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);
 }...

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Выбранный номер строки в экземпляре JTable всегда является выбранным номером строки на стороне обзора.

Если вы активируете сортировщики рядов, они больше не будут соответствовать номеру ряда на стороне модели.

Для преобразования между этими двумя номерами строк JTable предлагает методы преобразования из «индекса строки просмотра» в «индекс строки модели» и наоборот. Эти методы называются convertRowIndexToModel и convertRowIndexToView.

В обработчике mouseClicked вам нужно вызвать функцию convertRowIndexToModel следующим образом:

if (bookTable.getSelectedRow() >= 0){
    Book book = books.get(bookTable.convertRowIndexToModel(bookTable.getSelectedRow()));
    setBook(book);
}

Большое спасибо, сэр. Это действительно помогает.

Alexander Paudak 16.09.2018 17:06

Проблема в том, что вы храните данные в двух местах:

  1. в TableModel
  2. в ArrayList

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

Вы можете просто создать объект Book из выбранной строки, используя метод getValueAt (..) JTable. Вам нужно будет вызвать этот метод для каждого столбца в таблице.

Или другой подход - создать настраиваемую TableModel, которая содержит объекты Book, тогда вы можете просто получить объект Book прямо из таблицы. Это немного больше работы, но это лучший подход.

Ознакомьтесь с Модель таблицы строк для пошагового подхода к созданию настраиваемой модели TableModel для настраиваемого объекта.

Другие вопросы по теме