События в UI полностью отделены от глобальных событий, вам потребуется самостоятельно регистрировать слушатели UI в глобальном компоненте-бине.
Например:
@Component
public class MessageEventBroadcaster {
public final List<WeakReference<Consumer<GlobalMessageEvent>>> subscriptions = new ArrayList<>();
@EventListener
protected void onMessage(GlobalMessageEvent event) {
synchronized (subscriptions) {
Iterator<WeakReference<Consumer<GlobalMessageEvent>>> iterator = subscriptions.iterator();
while (iterator.hasNext()) {
WeakReference<Consumer<GlobalMessageEvent>> reference = iterator.next();
Consumer<GlobalMessageEvent> eventConsumer = reference.get();
if (eventConsumer == null) {
iterator.remove();
} else {
eventConsumer.accept(event);
}
}
}
}
public void subscribe(Consumer<GlobalMessageEvent> handler) {
synchronized (subscriptions) {
subscriptions.add(new WeakReference<>(handler));
}
}
}
Это компонент, который хранит список подписок в виде слабых ссылок. Это нужно, чтобы не порождать утечки памяти.
В расширенном главном окне, мы подписываемся на рассылку события:
public class ExtAppMainWindow extends AppMainWindow {
@Inject
private MessageEventBroadcaster broadcaster;
@Inject
private BackgroundWorker backgroundWorker;
private Consumer<GlobalMessageEvent> messageHandler;
@Override
public void init(Map<String, Object> params) {
super.init(params);
UIAccessor uiAccessor = backgroundWorker.getUIAccessor();
// save reference to message handler
messageHandler = event -> uiAccessor.access(() -> {
showNotification(event.getMessage());
});
broadcaster.subscribe(messageHandler);
}
Здесь мы создаём подписку на рассылку и обеспечиваем доступ к состоянию UI при помощи UIAccessor. Это необходимо, поскольку рассылка выполняется из другого потока. Из блока access { }
мы можем изменять состояние UI, например, показывать нотификации.
Разослать событие можно при помощи бина Events:
@Inject
private Events events;
public void onSendBtnClick() {
events.publish(new GlobalMessageEvent("Demo for all!"));
}
Я подготовил небольшой пример: https://github.com/cuba-labs/demo-broadcast-event
Обратите внимание, что в этом примере бин и экраны находятся в одном приложении - Web Client. Этот способ не подходит для отправки событий из core в Web Client.