Индексы строк JTable и DefaultTableModel теряют свою синхронизацию после сортировки JTable - PullRequest
3 голосов
/ 14 июня 2010

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' имеют разные индексы строк.

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

Ответы [ 3 ]

10 голосов
/ 14 июня 2010

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

int row = resultsTable.getSelectedRow();
if (row != -1) {
   row = table.convertRowIndexToModel(row);
   String value = (String) myModel.getValueAt(row, columnIndex)
0 голосов
/ 14 ноября 2011

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

0 голосов
/ 14 июня 2010

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

// 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, чтобы получить значение.

...