У меня есть JTable, у которого 1-я строка пустая. Теперь, когда я сортирую таблицу на основе столбца, нажимая на этот столбец, пустая строка идет внизу. Если я вставляю что-то в пустую строку и сортирую, то строка помещается соответственно. Как отслеживать индекс строки, даже если он отсортирован. Мне нужно получить доступ к этой строке, но если пользователь выполнит сортировку, я потеряю индекс строки, так как это уже не первая строка.
Как отслеживать индекс строки, когда JTable был отсортирован пользователем?
Ответ 1
Предполагая, что вы используете материал TableRowSorter
, добавленный в Java 6, я думаю, что вам нужно взглянуть на методы convertRowIndexToModel
и convertRowIndexToView
в классе RowSorter
. Вы бы сделали что-то вроде
table.getRowSorter().convertRowIndexToView(0)
чтобы узнать, какой индекс видимой строки действительно является индексом строки 0 из вашей модели.
Изменить: как указал Тульский в комментариях, это может вызвать исключение NullPointerException, если сортировщик строк не назначен для таблицы. Лучше использовать методы непосредственно на JTable, например, table.convertRowIndexToView(0)
Ответ 2
JTable.convertRowIndexToView()
вернет вам индекс строки в представлении на основе его индекса в модели. JTable.convertRowIndexToModel()
будет делать обратное.
Ответ 3
РЕШЕНИЕ 1
При использовании jTable1.convertRowIndexToModel(jTable1.getSelectedRow())
возникает некоторая проблема, если сортировка значений в соответствии с датой или временем вернет неправильные значения из convertRowIndexToView(0)
, поэтому используйте convertRowIndexToModel(0)
.
РЕШЕНИЕ 2
Это будет извлекаться из новой модели при сортировке.
jTable1.getValueAt(jTable1.getSelectedRow(), 0);
Это будет извлекать значение в соответствии с исходным индексом даже при сортировке.
((DefaultTableModel)jTable1.getModel()).getValuAt(jTable1.getSelectedRow(), 0);