Как получить данные о JTable при использовании RowSorter? - PullRequest
0 голосов
/ 16 сентября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

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

  1. в TableModel
  2. в ArrayList

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

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

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

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

0 голосов
/ 16 сентября 2018

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

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

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

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

if (bookTable.getSelectedRow() >= 0){
    Book book = books.get(bookTable.convertRowIndexToModel(bookTable.getSelectedRow()));
    setBook(book);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...