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действия, которое должно вызвать открытие экрана.
Также вы можете использовать метод 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).