3.5.1.1.2. 界面控制器方法

本章节我们介绍一些界面控制器基类的方法,可以直接在代码中调用或者重写。

所有界面都可用的方法
  • show() - 展示界面。该方法通常在创建界面之后调用,参阅 打开界面

  • close() - 关闭界面,使用 StandardOutcome 枚举参数或者 CloseAction 对象。示例:

    @Subscribe("closeBtn")
    public void onCloseBtnClick(Button.ClickEvent event) {
        close(StandardOutcome.CLOSE);
    }

    参数值也传递至 BeforeCloseEventAfterCloseEvent 事件中,因此可以在事件监听器中也能获取界面关闭的原因。参阅 界面关闭后执行代码以及返回值 了解更多使用这些监听器的方法。

  • getScreenData() - 返回 ScreenData 对象,该对象作为所有在界面 XML 描述中定义的 数据组件 的寄存器,因此可以使用 loadAll() 方法为界面加载数据:

    @Subscribe
    public void onBeforeShow(BeforeShowEvent event) {
        getScreenData().loadAll();
    }
  • getSettings() - 返回 Settings 对象,可以读写当前用户对界面的自定义设置。

  • saveSettings() - 保存 Settings 对象中的设置。如果 cuba.gui.manualScreenSettingsSaving 设置为 false(默认值),则会自动调用该方法。

StandardEditor 的方法
  • getEditedEntity() - 当界面展示时,返回编辑实体的实例。实例是 @EditedEntityContainer 注解内指定的数据容器中的实例。

    InitEventAfterInitEvent 事件监听器内,该方法会返回 null。在 BeforeShowEvent 事件监听器内,该方法会返回传递给界面用来编辑的实体,之后在界面打开的过程中,实体会重新加载,一个不同的实例会设置给数据容器。

可以用下面的方法关闭编辑界面:

  • closeWithCommit() - 验证并保存数据,然后用 StandardOutcome.COMMIT 关闭界面。

  • closeWithDiscard() - 忽略任何未保存的数据并用 StandardOutcome.DISCARD 关闭界面。

如果界面的 DataContext 有未保存的改动,则会在界面关闭前弹出对应的消息对话框。可以用 cuba.gui.useSaveConfirmation 应用程序属性调整通知类型。如果用 closeWithDiscard()close(StandardOutcome.DISCARD) 方法,则会忽略未保存的改动而且没有通知。

  • commitChanges() - 保存数据,但不关闭界面。可以从自定义事件监听器调用该方法或者重写默认的 windowCommit 操作监听器,这样能在数据保存后做一些其他的事情,示例:

    @Override
    protected void commit(Action.ActionPerformedEvent event) {
        commitChanges().then(() -> {
            // this flag is used for returning correct outcome on subsequent screen closing
            commitActionPerformed = true;
            // perform actions after the data has been saved
        });
    }

    commit() 方法的默认实现展示成功提交的通知消息。可以在界面初始化过程中用 setShowSaveNotification(false) 方法关闭。

  • 重写 validateAdditionalRules() 方法为保存数据前添加额外的数据验证。方法应该在传入的 ValidationErrors 对象中保存验证错误的信息。之后,此信息会与标准验证的错误信息一起展示。示例:

private Pattern pattern = Pattern.compile("\\d");

@Override
protected void validateAdditionalRules(ValidationErrors errors) {
    if (getEditedEntity().getAddress().getCity() != null) {
        if (pattern.matcher(getEditedEntity().getAddress().getCity()).find()) {
            errors.add("City name cannot contain digits");
        }
    }
    super.validateAdditionalRules(errors);
}
MasterDetailScreen 的方法
  • getEditedEntity() - 当界面在编辑模式时,返回正在编辑的实体实例。即设置在 form 组件数据容器中的实例。如果界面不在编辑模式,此方法会抛出 IllegalStateException

  • 重写 validateAdditionalRules() 方法可以添加额外的数据验证,与上面 StandardEditor 介绍的一样。