InputDialogFacet

InputDialogFacet 提供另一种配置和打开 输入对话框 的方法。通过 Studio 可视化设计器的帮助,可以在 XML 描述中配置 InputDialogFacet,而无需在界面控制器使用 Dialogs.createInputDialog() 方法。

组件的 XML 名称:inputDialog

属性

InputDialogFacet 在界面 XML 描述的 facets 元素中定义,有下列属性:

  • dialogActions - 在对话框中添加最常用的操作按钮。可能值:

    • OK_CANCEL -添加 OKCancel 按钮。默认值。

    • OK -添加 OK 按钮

    • YES_NO -添加 YesNo 按钮。

    • YES_NO_CANCEL -添加 YesNoCancel 按钮。

  • onAction - 定义一个 action 的 id,用于打开对话框。

  • onButton - 定义一个 button 的 id,用于打开对话框。

操作

参阅 actions

参数

如需在对话框内添加输入控件,可以在 parameters 元素中创建下列子元素。框架会为每个参数创建对应的 可视化组件,用于输入。

参数 可视化组件

bigDecimalParameter

TextFielddecimal 数据类型

dateParameter

DateFieldDAY 精度

dateTimeParameter

DateFieldMIN 精度

doubleParameter

TextFielddouble 数据类型

intParameter

TextFieldint 数据类型

longParameter

TextFieldlong 数据类型

stringParameter

TextField

timeParameter

TimeField

上面列举的所有参数都有 defaultValue 属性,支持为对应的控件设置默认值。

<parameters>
    <bigDecimalParameter id="bigDecimalParameter"
                         caption="Big Decimal Parameter"
                         defaultValue="55.753"
                         required="false"/>
</parameters>
  • entityParameter 展示 EntityPicker。如需为控件定义实体类,使用 entityClass 属性。

    <parameters>
        <entityParameter caption="Entity Parameter"
                         entityClass="ui.ex1.entity.City"
                         id="entityParameter"
                         required="true"/>
    </parameters>
  • enumParameter 展示 ComboBox。如需为控件定义枚举类,使用 enumClass 属性。

    <parameters>
        <enumParameter caption="Enum Parameter"
                       enumClass="ui.ex1.entity.Hobby"
                       id="enumParameter"/>
    </parameters>

事件和处理器

如需使用 Jmix Studio 生成处理器的桩代码,需要在界面 XML 描述或者 Component Hierarchy 面板选中 facet 元素,然后用 Component Inspector 面板的 Handlers 标签页生成。

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

InputDialogCloseEvent

InputDialogCloseEvent 在对话框关闭后发送。使用 InputDialogCloseEvent.closedWith() 方法,可以跟踪窗口是如何关闭的:

@Autowired
private Notifications notifications;

@Subscribe("inputDialog")
public void onInputDialogInputDialogClose(InputDialog.InputDialogCloseEvent event) {
    if (event.closedWith(DialogOutcome.OK)) {
        notifications.create()
                .withCaption("The order will be displayed in your profile within 5 minutes")
                .show();
    }
}

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

DialogResultHandler

DialogResultHandler 代理方法支持处理输入对话框的结果:

@Autowired
private Notifications notifications;

@Install(to = "inputDialog", subject = "dialogResultHandler")
private void inputDialogDialogResultHandler(InputDialog.InputDialogResult inputDialogResult) {
    String closeActionType = inputDialogResult.getCloseActionType().name();

    String values = inputDialogResult.getValues().entrySet()
            .stream()
            .map(entry -> String.format("%s = %s", entry.getKey(), entry.getValue()))
            .collect(Collectors.joining(", "));

    notifications.create(Notifications.NotificationType.HUMANIZED)
            .withCaption("InputDialog Result Handler")
            .withDescription("Close Action: " + closeActionType +
                    ". Values: " + values)
            .show();
}

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

Validator

Validator 代理方法支持验证输入值。接收特定的 InputDialog.ValidationContext,其中包含输入的值。方法需要返回 ValidationErrors 实例,描述错误信息。错误会与其他验证异常一起在通知窗口展示。

@Install(to = "inputDialog", subject = "validator")
private ValidationErrors inputDialogValidator(InputDialog.ValidationContext validationContext) {
    String phone = validationContext.getValue("phoneField");
    String address = validationContext.getValue("addressField");
    if (Strings.isNullOrEmpty(phone) && Strings.isNullOrEmpty(address)) {
        return ValidationErrors.of("Phone or Address must be filled");
    }
    return ValidationErrors.none();
}

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

XML 属性

可以在 Studio 界面设计器中的 Component Inspector 面板查看和编辑 facet 支持的属性。