#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.