TableModel.fireTableCellUpdated(tableRowIndex, tableColumnIndex) не обновляет ячейку в JTable

У меня есть JTable в моем коде.

И всякий раз, когда происходит обновление любого конкретного столбца в строке (в основном ячейки), я обновляю соответствующий значок в этой ячейке.

поэтому я в основном следую этим шагам.

Шаг 1: Я обновляю модель.

Шаг 2 2: Я звоню

       tableModel.fireTableCellUpdated(tableRowIndex, tableColumnIndex);

Это прекрасно работает.

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

Проблема: значок не отображается нарисованным. Но если я наведу фокус на верхнюю часть этой строки в таблице, он рисует значок.

Наблюдение: я вижу, что tableRowIndex и tableColumnIndex верны после перетаскивания столбцов.

Просто для проверки я добавил этот кусок кода в сценарий проблемы.

     examTable.repaint(examTable.getCellRect(examTableRowIndex, examTableColumnIndex, true));

Это правильно перекрашивает ячейку.

Но это не правильное решение, я думаю. Я попытался отладить код, но не нашел много информации о проблеме.


person bHaRaTh    schedule 21.08.2014    source источник
comment
извините, это описание ни о чем не говорит, ничего важного о том, как, где и почему, тогда невозможно создать какое-либо представление, для лучшей помощи скорее опубликуйте SSCCE / MCVE, короткий, исполняемый, компилируемый с жестко закодированным значением для JTable / XxxTableModel: - )   -  person mKorbel    schedule 21.08.2014


Ответы (1)


Я звоню tableModel.fireTableCellUpdated(tableRowIndex, tableColumnIndex);

Это не правильно. Вы никогда не должны вызывать методы firXXX напрямую. Задача TableModel заключается в том, чтобы вызвать соответствующее событие при изменении данных.

Я обновлю соответствующий значок в этой ячейке.

Все, что вам нужно сделать, это вызвать метод model.setValueAt(...) для изменения значка, и модель уведомит таблицу об изменении данных, чтобы таблица могла перерисовать себя.

examTable.repaint(...)

Опять же, вам не нужно вручную вызывать перерисовку таблицы.

Но проблема возникает, когда я перетаскиваю столбцы из одной позиции в другую в заголовке таблицы.

Не уверен, зачем вам нужен специальный код для этого, если вы следуете совету сверху. Но если по какой-то причине это все еще необходимо, вам нужно просмотреть методы convertColumnIndex...(...), чтобы убедиться, что вы используете правильный индекс для своего столбца.

person camickr    schedule 21.08.2014
comment
Спасибо camickr за вклад. - person bHaRaTh; 26.08.2014