Когда у вас есть асинхронная шина событий и события пожара, скажем, в модели, которая попадает в пользовательский интерфейс, у вас, вероятно, есть следующая проблема:
Зарегистрированный обработчик выполняется в рабочем потоке, но все изменения качания пользовательского интерфейса должны выполняться в потоке событий AWT.
Это означает, что вам нужно конвертировать весь ваш код обработчика в EventQueue.invokeLater(...)
.
Это похоже на много кодовый табличный код. Интересно, есть ли более разумное решение для этой проблемы.
Как насчет расширения к шине событий guava, которая помещает обработчик для выполнения в специальном потоке? Это может быть отмечено аннотацией, например. @ExecuteWithinEDT
:
class EventBusChangeRecorder {
@Subscribe @ExecuteWithinEDT void recordCustomerChange(ChangeEvent e) {
recordChange(e.getChange());
}
}