Сортировка JTable строк - PullRequest
3 голосов
/ 24 июня 2011

Скажем, у меня есть JTable с некоторыми данными в нем.Вызов table.getValueForCell (row, col) возвращает содержимое ячейки.Это как и ожидалось.

Теперь скажите, что я хочу отсортировать свой стол.Я щелкаю заголовок таблицы (столбец), и она сортирует таблицу.Если я сделаю вызов table.getValueForCell (row, col) с одинаковыми значениями для row и col.Теперь здесь другая строка, потому что таблица была отсортирована.Однако table.getValueForCell (row, col) возвращает старые данные.Кажется, что базовые структуры данных, которые содержат данные таблицы, не обновляются при сортировке.

Есть идеи, как это исправить или что я могу делать не так?

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

Данные всегда сохраняются в исходном порядке в TableModel. Вы можете получить доступ к исходному заказу, используя:

table.getModel().getValueAt(...);

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

table.getValueAt(...);

Если вам по какой-то причине необходимо конвертировать туда и обратно между двумя, вы можете использовать любой из методов таблицы оценки:

convertRowIndexToModel(...); 
convertRowIndexToView(...); 
2 голосов
/ 24 июня 2011

Из документации для JTable.

JTable использует исключительно целые числа для ссылки как на строки, так и на столбцы отображаемой модели.JTable просто берет табличный диапазон ячеек и использует getValueAt (int, int) для извлечения значений из модели во время рисования.Важно помнить, что индексы столбцов и строк, возвращаемые различными методами JTable, относятся к JTable (представлению) и не обязательно совпадают с индексами, используемыми моделью.

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

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

Аналогично, при использовании функциональности сортировки и фильтрации, предоставляемой RowSorter, базовая TableModel не должна знать, как выполнять сортировку, скорее, RowSorter с этим справится.Преобразование координат будет необходимо при использовании основанных на строках методов JTable с базовым TableModel.Все методы, основанные на строках JTables, относятся к RowSorter, который не обязательно совпадает с базовым TableModel.Например, выбор всегда в терминах JTable, поэтому при использовании RowSorter вам нужно будет конвертировать с помощью convertRowIndexToView или convertRowIndexToModel.Ниже показано, как преобразовать координаты из JTable в базовую модель:

А также, Javadoc для getValueAt:

public Object getValueAt(int row, int column)

Возвращает значение ячейки встрока и столбец.

Примечание. Столбец указывается в порядке отображения табличного представления, а не в порядке столбцов TableModel.Это важное различие, потому что, когда пользователь переставляет столбцы в таблице, столбец с данным индексом в представлении будет меняться.При этом действия пользователя никогда не влияют на порядок столбцов модели.

Однако вы можете использовать оболочку таблицы, как описано в этом другом разделе StackOverflow.Действительно, метод, который вы вызвали, не существует в JTable и, похоже, уже пришел из этой темы!Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...