Как обновить JTableModel после того, как сортировщик изменил порядок строк?

#java #swing #sorting #jtable

#java #качать #сортировка #jtable

Вопрос:

Я реализовал JTable, в котором я могу искать записи с помощью текстового поля.

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

Это работает, но бесполезно, если я сортирую таблицу, нажимая на любой столбец, потому что сортировка, похоже, не обновляет DefaultTableModel .

Таблица является частью более крупного проекта, который чрезвычайно сложен и полон зависимостей, поэтому я не могу опубликовать небольшой пример, но я думаю, что это подведет итог:

Учитывая DefaultTableModel A множество не отсортированных данных о JTable B том, где B.setAutoCreateRowSorter() находится true , как происходит обновление B после нескольких / любых сортировок A ?

Я прочитал документы, а также изучил это:

http://www.codejava.net/java-se/swing/6-techniques-for-sorting-jtable-you-should-know

А также немного углубился TableRowSorter#addRowSorterListener , но он может только сказать мне, что столбец был отсортирован, что не очень полезно. Если, конечно, я не использую этот столбец, чтобы попытаться отсортировать все значения в многомерном массиве, затем очистить таблицу, а затем присвоить все обратно .. но очевидно, что это очень медленно и на самом деле не вариант в моем случае.

Обратитесь к этому для получения информации, предоставленной RowSorterEvent :

https://docs.oracle.com/javase/7/docs/api/javax/swing/event/RowSorterEvent.html

Может кто-нибудь указать мне правильное направление?

Ответ №1:

Когда выполняется запрос, мой код получает DefaultTableModel, ищет элемент в каждом столбце и строке…

Поэтому не выполняйте поиск в TableModel. Вы можете использовать метод table.getValueAt(…) для поиска элемента в каждой строке / столбце таблицы. Доступ к данным будет осуществляться в текущем отсортированном порядке таблицы.

потому что сортировка, похоже, не обновляет DefaultTableModel.

Правильно, обновляется только представление (JTable).

Если вы хотите продолжать поиск непосредственно в TableModel, вам необходимо преобразовать индексы модели в индексы представления всякий раз, когда вы хотите вызвать метод JTable (т. е. Выбрать строку таблицы).). Это делается с помощью следующих JTable методов:

 int columnColumn = table.convertColumnIndexToView(modelColumn);
int row = table.convertRowIndexToView(modelRow);
  

Существуют также методы для преобразования значений представления в значения модели.

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

1. Именно то, что я искал, исправило все мои проблемы.