Проблема с EventListener в UI

Имеем класс события (расположен в web):

public class SomeEvent extends ApplicationEvent implements UiEvent {
SomeEvent (Object source) {
        super(source);
    }
}

Экран DocumentEdit в котором при коммите публикуется событие:

dsContext.addAfterCommitListener((context, result) -> {
    AppBeans.get(Events.class).publish(new CifraUiEvent("documentCommitted"));
});

Есть экран DocumentBrowse (родитель) и в нем вкладками(tabs) вложены экраны DocumentBrowseFrame.

В DocumentBrowseFrame так:

@EventListener
public void onUiEvent(SomeEvent event) {
    // some action...
}

Далее 2 варианта действий.
Первый, в окне DocumentBrowse:

  1. Открыли документ.
  2. Сохранили.
  3. SomeEvent улетел (УСПЕШНО).
  4. SomeEvent успешно перехвачен всем открытыми DocumentBrowseFrame.

Второй, в окне DocumentBrowse, в фрейме DocumentBrowseFrame :

  1. Открыли документ.
  2. Сохранили.
  3. SomeEvent улетел. (УСПЕШНО)
  4. SomeEvent НЕ перехвачен, listener вообще не отрабатывает.

Т.е. разница
Что за беда и в чем может быть причина столь, с моей точки зрения, странного поведения?

Здравствуйте,

По описанию очень сложно понять, что пошло не так. Не могли бы вы воспроизвести проблему в небольшом демо-проекте и приложить его в виде архива?

2 симпатии

Повторил https://github.com/itAvgur/cuba-event-problem
Вообщем получается так:
commit 1) Форма из который прилетает event открывается через стандартные кнопки Edit - все ок.
commit 2) Форма из которой прилетает event открывается через кастомно добавленную кнопку - event не доходит.

1 симпатия

Такое поведение вызвано особенностью дизайна UiEvent - события получают только активные экраны. Во втором случае у вас экран скрыт за редактором, который открыт поверх как THIS_TAB, то есть экран списка - неактивен.

Это важная часть поведения событий, которую мы пока не готовы изменить.

В вашем случае вы можете использовать простой обработчик EditAction - afterWindowClosedHandler, чтобы отреагировать на изменения в редакторе, глобальные события для этого использовать необязательно.

Или можете отправить событие уже после закрытия окна редактора - тогда окно списка станет активно:

public class DocumentEdit extends AbstractEditor<Document> {
    @Inject
    private Events events;
    
    public void onOkBtnClick(Component ignore) {
        commitAndClose();
        // экран уже закрыт
        events.publish(new CifraUiEvent("documentCommitted"));
        showNotification("Event sent",NotificationType.TRAY);
    }
}
2 симпатии