Лучшие практики для обновления данных в AbstractTableModel в потоке без AWT - PullRequest
1 голос
/ 12 июля 2011

Я подклассифицировал AbstractTableModel для использования в качестве модели для моего JTable. Всякий раз, когда данные добавляются в, я вызываю fireTableRowsInserted() в потоке AWT. Весь доступ к моему базовому контейнеру сделан потокобезопасным с помощью синхронизированных методов.

Этот шаблон до сих пор работал нормально для меня. Однако теперь я хочу удалить данные из списка, который я понял, у меня есть проблема с многопоточностью. Если я удалю строку и вызову fireTableRowsDeleted() в потоке AWT, я все равно смогу получить вызов getValueAt() для индекса строки, которого больше не существует.

Каков наилучший метод выполнения операций на табличной модели вне потока AWT?

Ответы [ 2 ]

5 голосов
/ 12 июля 2011

Лучшая практика ИМХО - избегать этого. Оберните каждый доступ к модели из другого потока внутри Runnable и используйте SwingUtilities.invokeLater для обновления модели.

1 голос
/ 12 июля 2011

Вам придется удалить данные из EDT.Любая операция, которая приводит к AbstractTableModel срабатыванию события изменения, должна быть выполнена в EDT.

...