2013-05-17 10 views
0

Мне нужно обновить некоторые ячейки JTable с фиксированным интервалом в отдельном потоке из потока отправки событий. Другие ячейки могут обновляться только потоком отправки событий, так что эти два потока никогда не будут обновлять одну и ту же ячейку.Безопасно ли вызывать fireTableRowsUpdated() в потоке отправки, отличном от события?

Как только вы изменили данные JTable, общий способ - позвонить fireTableRowsUpdated(), чтобы перекрасить JTable. Обычно вы вызываете fireTableRowsUpdated() в поток потока событий, но могу ли я назвать его в другом потоке? Если да, то есть fireTableRowsUpdated() поточно-безопасный, тоже? Есть вероятность, что JTable будет обновляться одновременно.

+0

Вы никогда не должны вызывать fireTableRowsUpdated() напрямую. Это задача TableModel. – camickr

+0

Для этого вы также можете использовать Swing Timer. –

ответ

3

Из документации для JTable:

Внимание: свинг не поточно. Для получения дополнительной информации см. Политику Swing Threading.

Это links к следующему:

В общем свинг не поточно. Все компоненты Swing и связанные классы, если не указано иное, должны быть доступны в потоке диспетчеризации событий.

И еще к точке Вашего вопроса:

Это ограничение также относится к моделям, прикрепленных к Свинг компонентов. Например, если TableModel привязан к JTable, TableModel должен быть изменен только в потоке диспетчеризации событий.

Теперь так получилось, что вы можете уйти от дел, которые нарушают эту политику. Но зачем это делать, когда достаточно легко создать и гарантии, что ваш код is thread-safe?

2

Использование SwingUtilities.invokeLater() вместо SwingWorker, если вы просто хотите передать выполнение к Event Dispatcher Thread

Подробнее о SwingUtilities.invokeLater

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