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