#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. Именно то, что я искал, исправило все мои проблемы.