Индексы строк JTable и DefaultTableModel теряют синхронизацию после сортировки JTable

#java #sorting #synchronization #jtable #tablemodel

#java #сортировка #синхронизация #jtable #табличная модель

Вопрос:

JAVA NETBEANS

 // resultsTable, myModel
JTable resultsTable;
DefaultTableModel myModel; //javax.swing.table.DefaultTableModel
myModel = (DefaultTableModel) resultsTable.getModel();

// event of clicking on item of table
String value = (String) myModel.getValueAt(resultsTable.getSelectedRow(), columnIndex)
  

Я использую JTable и DefaultTableModel для просмотра таблицы с различной информацией
и я хочу получить значение определенного столбца выбранного индекса таблицы.

Код, который я написал выше, работает нормально, за исключением случаев, когда: Я использую сортировку графического интерфейса пользователя (щелкните по имени поля, которое я хочу отсортировать в таблице) Таблица отсортирована правильно, но после этого, когда я выбираю строку, она получает значение строки, которая была там до сортировки. Это означает, что после сортировки (с использованием графического интерфейса JTable) объекты ‘MyModel’ и ‘resultsTable’ имеют разные индексы строк.

Как мне синхронизировать эти два?

Ответ №1:

Вам нужно использовать методы ‘convertXXX’ в JTable см. JavaDoc

 int row = resultsTable.getSelectedRow();
if (row != -1) {
   row = table.convertRowIndexToModel(row);
   String value = (String) myModel.getValueAt(row, columnIndex)
  

Ответ №2:

Проблема с использованием JTable.getValueAt() заключается в получении нужного столбца. Когда столбцы перемещаются в графическом интерфейсе, индексы «меняются», чтобы соответствовать представлению. Используя AbstractTableModel.getValueAt() и JTable.convertXXX() (как описано Гийомом), это просто вопрос использования индексов столбцов для модели при извлечении данных.

Ответ №3:

За исключением решения, предоставленного Гийомом (спасибо) Я сделал это:

 // resultsTable, myModel

JTable resultsTable;

DefaultTableModel myModel; //javax.swing.table.DefaultTableModel

myModel = (DefaultTableModel) resultsTable.getModel();

// event of clicking on item of table

String value = (String) **resultsTable**.getValueAt(resultsTable.getSelectedRow(), columnIndex)
  

Для получения значения я использовал объект resultsTable вместо объекта MyModel.