ScreenFacet

ScreenFacet 提供另一种 打开 关联界面并为之 传递参数 的方式。通过 Studio 可视化设计器的帮助,可以在 XML 描述中配置 ScreenFacet,而无需在界面控制器使用 ScreenBuilders.screen() 方法。

组件的 XML 名称:screen

基本用法

下面例子中,当 openDialogAction 执行时,会以对话框的方式打开 uiex1_Customer.browse 界面:

<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 在界面 XML 描述的 facets 元素中定义,有下列属性:

  • screenId - 指定需要打开的界面 id。

  • screenClass - 指定需要打开的界面控制器 Java 类。

  • openMode - 界面打开模式,支持下列值:

    • NEW_TAB - 在主窗口的新标签页打开界面。默认值。

    • THIS_TAB - 在当前标签页的界面栈顶打开界面。

    • DIALOG - 以模态框的形式打开界面。

    • ROOT - 在主窗口打开界面。

ScreenFacet 可以绑定至 buttonaction。此时,当点击 button 或触发 action 时,会打开界面。

  • onAction - 定义一个 action 的 id,用于打开界面。

  • onButton - 定义一个 button 的 id,用于打开界面。

另外,也支持通过 ScreenFacet.show() 方法打开界面:

@Autowired
private ScreenFacet<Screen> screenFacet;

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

传参

如需为界面传递参数,请使用 properties 元素。该元素定义属性列表,这些属性用界面的公共 setters 注入打开的界面。

例如,我们从 ScreenFacetScreen 界面给 AnotherScreennum 属性传递一个整数值。

@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 定义 setter 用于传递值。
3 将收到的值赋值给标签。

ScreenFacetScreen 的 XML 描述中,我们为 property 元素定义 namevalue 属性:

<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 层级结构面板选中 facet 元素,然后用 Jmix UI 组件面板的 Handlers 标签页生成。

或者可以使用界面控制器顶部面板的 Generate Handler 按钮。

AfterCloseEvent

AfterCloseEvent 在 facet 配置的界面关闭之后发送。参阅 AfterCloseEvent 了解详情。 is sent after the screen configured by the facet is closed. See AfterCloseEvent for details.

如需以编程的方式注册事件处理器,使用 addAfterCloseEventListener() 方法。

AfterShowEvent

AfterShowEvent 在 facet 配置的界面展示之后发送。参阅 AfterShowEvent 了解详情。

如需以编程的方式注册事件处理器,使用 addAfterShowEventListener() 方法。

OptionsProvider

OptionsProvider 代理方法支持编程式配置界面参数,示例:

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

编程式用法,调用 setOptionsProvider() 方法。

ScreenConfigurer

该处理方法接收一个界面作为参数,并可以在打开之前对其进行初始化。如果需要通过 public setter 为打开的界面提供参数,可以使用 configurer。设置 configurer 的首选方法是使用带有 @Install 注解的控制器方法,示例:

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

编程式用法,调用 setScreenConfigurer(Consumer<S> screenConfigurer) 方法。

XML 属性

可以在 Studio 界面设计器中的 Jmix UI 组件面板查看和编辑 facet 支持的属性。