ScreenFacet

Фасет ScreenFacet предоставляет альтернативный способ открывать связанные экраны и передавать им параметры. Вместо использования метода ScreenBuilders.screen() в контроллере экрана вы можете настроить ScreenFacet в XML-дескрипторе с помощью визуального дизайнера Studio.

XML-имя компонента: screen.

Основы

В приведенном ниже примере экран uiex1_Customer.browse будет открыт в виде диалогового окна при выполнении openDialogAction:

<actions>
    <action id="openDialogAction"
            caption="Open a screen as modal dialog"/>
</actions>
<facets>
    <screen id="actionScreenFacet"
            openMode="DIALOG"
            screenId="uiex1_Customer.browse"
            onAction="openDialogAction">
    </screen>
</facets>

ScreenFacet определяется в элементе facets XML-дескриптора экрана и имеет следующие атрибуты:

  • screenId - указывает id открываемого экрана.

  • screenClass - указывает класс Java контроллера открываемого экрана.

  • openMode - определяет режим открытия экрана. Возможны следующие значения:

    • NEW_TAB - открывает экран на новой вкладке главного окна. Значение по умолчанию.

    • THIS_TAB - открывает экран поверх стека экранов текущей вкладки.

    • DIALOG - открывает экран в виде модального диалога.

    • ROOT - открывает экран в качестве основного.

Вы можете привязать ScreenFacet к кнопке или действию, чтобы окно открывалось по нажатию кнопки или выполнению действия. Для этого используйте следующие атрибуты:

  • onAction - определяет id действия, которое должно вызвать открытие экрана.

  • onButton - определяет id кнопки, которая должно вызвать открытие экрана.

Также вы можете использовать метод ScreenFacet.show() для открытия экрана:

@Autowired
private ScreenFacet<Screen> screenFacet;

@Subscribe("btn")
public void onBtnClick(Button.ClickEvent event) {
    screenFacet.show();
}

Передача параметров

Чтобы передать параметры на экран, используйте элемент properties. Он определяет список свойств, которые будут инжектированы в открытый экран с помощью общедоступных сеттеров.

Например, давайте передадим целое значение свойству num экрана AnotherScreen из ScreenFacetScreen:

@UiController("sample_AnotherScreen")
@UiDescriptor("another-screen.xml")
public class AnotherScreen extends Screen {

    @Autowired
    private Label<Integer> label; (1)

    private Integer num;

    public void setNum(Integer num) { (2)
        this.num = num;
    }

    @Subscribe
    public void onAfterShow(AfterShowEvent event) { (3)
        label.setValue(num);
    }
}
1 Надпись будет отображать полученное значение.
2 Определение сеттера для присвоения передаваемого значения.
3 Надпись будет отображать принятое значение.

В XML-дескрипторе ScreenFacetScreen мы определим атрибуты name и value элемента property:

<window xmlns="http://jmix.io/schema/ui/window"
        caption="msg://screenFacetScreen.caption">
    <facets>
        <screen id="propScreenFacet"
                screenId="sample_AnotherScreen"
                openMode="DIALOG"
                onButton="propBtn">
           <properties>
                <property name="num" value="55"/>
            </properties>
        </screen>
    </facets>
    <layout>
            <button id="propBtn"
                    caption="Pass params"
                    width="100%"/>
    </layout>
</window>

События и слушатели

Чтобы сгенерировать заглушку слушателя в Jmix Studio, выберите фасет в XML-дескрипторе экрана или на панели иерархии Jmix UI и используйте вкладку Handlers на панели инспектора Jmix UI.

В качестве альтернативы вы можете воспользоваться кнопкой Generate Handler на верхней панели контроллера экрана.

AfterCloseEvent

AfterCloseEvent отправляется после закрытия экрана, настроенного фасетом. Подробнее см. в AfterCloseEvent.

Чтобы создать слушателя события программно, используйте метод addAfterCloseEventListener().

AfterShowEvent

AfterShowEvent отправляется после отображения настраиваемого фасетом экрана. Подробнее см. в AfterShowEvent.

Чтобы создать слушателя события программно, используйте метод addAfterShowEventListener().

OptionsProvider

Метод делегата OptionsProvider позволяет настраивать параметры экрана программно. Например:

@Install(to = "propScreenFacet", subject = "optionsProvider")
private ScreenOptions propScreenFacetOptionsProvider() {
    return new MapScreenOptions(ParamsMap.of("num", 55));
}

Чтобы создать OptionsProvider программно, используйте метод setOptionsProvider().

ScreenConfigurer

Это обработчик, который принимает экран и может инициализировать его перед открытием. Используйте конфигуратор, если вам нужно предоставить параметры открытому экрану через общедоступные сеттеры. Предпочтительным способом настройки конфигуратора является использование метода контроллера с аннотацией @Install, например:

@Install(to = "screenFacetC", subject = "screenConfigurer")
protected void screenFacetCScreenConfigurer(CustomerBrowse customerBrowse) {
    customerBrowse.setSomeParameter(55);
}

Чтобы создать ScreenConfigurer программно, используйте метод setScreenConfigurer(Consumer<S> screenConfigurer).

Все XML-атрибуты

Вы можете просматривать и редактировать применимые к фасету атрибуты с помощью панели инспектора Jmix UI в дизайнере экранов Studio.