4. Настройка взаимодействия между экранами

Пользователь должен иметь возможность изменять и сохранять базовое местоположение, щелкая на маркере карты. На данный момент наше приложение не предоставляет эту функциональность.

Перейдите к контроллеру экрана LocationLookupView и создайте методы setter и getter для передачи местоположения, которое мы хотим отобразить или сохранить.

public Location getSelected() {
    return selected;
}

public void setSelected(@Nullable Location selected) {
    this.selected = selected;

    currentLocationField.setValue(selected);

    if (selected != null) {
        setMapCenter(selected.getBuilding());
    }
}

Перейдите к контроллеру экрана UserDetailView и найдите обработчик onLocationFieldSelect(). Наша цель - не только открыть диалог, но и передать ранее сохраненное местоположение для редактируемого пользователя. Кроме того, нам нужно получить результат из диалога после его закрытия. Давайте внесем необходимые изменения в обработчик:

@ViewComponent
private JmixValuePicker<Location> locationField;

@Subscribe("locationField.select")
public void onLocationFieldSelect(final ActionPerformedEvent event) {
    dialogWindows.view(this, LocationLookupView.class)
            .withAfterCloseListener(closeEvent -> {
                if (closeEvent.closedWith(StandardOutcome.SELECT)) {
                    locationField.setValue(closeEvent.getView().getSelected()); (1)
                }
            })
            .open()
            .getView()
            .setSelected(getEditedEntity().getLocation()); (2)
}
1 Объект AfterCloseEvent содержит CloseAction, переданный в метод close() экрана. Мы анализируем действие закрытия с помощью метода closedWith() объекта события. Помните: в предыдущем разделе мы установили обработчик для действия select.
2 Передает местоположение редактируемого пользователя в setter LocationLookupView.

Запустите приложение и убедитесь, что взаимодействие между UserDetailView и LocationLookupView настроено правильно.