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)
.