2013-09-21 2 views
2

Что является правильным для получения значения ячейки из таблицы:Получить значение ячейки JTable с помощью rowInModel или rowInTable?

int rowInTable = table.getSelectedRow(); 
int rowInModel = table.convertRowIndexToModel(rowInTable); 


Object id = this.getValueAt(rowInModel,1); 

Или:

Object id = this.getValueAt(rowInTable,1); 

я id в моей модели класса.

+0

1-й из них правильный – nachokk

+0

Ни одно предложение не является полным. – camickr

ответ

1

я получаю идентификатор в моей модели класса.

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

Вам нужно понять разницу между «Просмотр» и «Модель».

int rowInTable = table.getSelectedRow(); 
int rowInModel = table.convertRowIndexToModel(rowInTable); 

Чтобы получить значение из "View" (то есть JTable) вы будете использовать:

Object id = this.getValueAt(rowInTable, table.convertColumnIndexToView(1)); 

Чтобы получить значение от "модели" вы будете использовать:

Object id = this.getModel().getValueAt(rowInModel, 1); 

Оба фрагмента кода возвращают одинаковое значение. В любом случае нужно преобразовать один индекс.

+0

Идеальное объяснение, спасибо ... – Sajad

4

Это правильный вариант.

int rowInTable = table.getSelectedRow(); 
int rowInModel = table.convertRowIndexToModel(rowInTable); 
Object id = this.getValueAt(rowInModel,1); 

Это необходимо, так как сортировка и фильтрация. Модель ничего не знает о View. Так как вы пытаетесь получить доступ к индексу модели через индекс просмотра, вам нужно его преобразовать. От JTable

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

Дополнительная информация:

convertRowIndexToView

convertRowIndexToModel

UPDATE

Почему "правильно"?

Как указано @camickr, это также относится к столбцам. Столбцы причины могут меняться. Таким образом, вы должны использовать

convertColumnIndexToView

convertColumnIndexToModel

+1

@sajjid, В духе вопроса этот ответ разумный, но он не является полным. Учитывая, что этот ответ предполагает, что таблица сортируется или фильтруется, ответ также должен предполагать, что TableColumns можно переупорядочить, и в этом случае нецелесообразно жестко кодировать значение столбцов для получения значения ID. См. Мое полное решение. – camickr

+0

@camickr, вы поняли это правильно! Я обновляю ответ, спасибо! – nachokk

Смежные вопросы