组件 API

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

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

ContextHelpIconClickHandler

这个处理器在用户点击组件旁边特殊的 ? 时调用。 点击事件的处理器优先级高于 提示文本。即,如果设置了处理器则不会展示上下文提示文本。

下面例子中,我们创建一个输入对话框,在 ContextHelpIconClickHandler 内调用。对话框收集相关信息并生成地址字符串。

@Autowired
private TextField<String> addressField;

@Autowired
private Dialogs dialogs;

@Install(to = "addressField", subject = "contextHelpIconClickHandler")
private void addressFieldContextHelpIconClickHandler(
        HasContextHelp.ContextHelpIconClickEvent event) {
    dialogs.createInputDialog(this)
            .withCaption("Get values")
            .withParameters(
                    InputParameter.entityParameter("city", City.class)
                            .withCaption("City:")
                            .withRequired(true),
                    InputParameter.stringParameter("street")
                            .withCaption("Street:"),
                    InputParameter.stringParameter("building")
                            .withCaption("Building:"),
                    InputParameter.intParameter("zip")
                            .withCaption("Zip:")
            )
            .withActions(DialogActions.OK_CANCEL)
            .withCloseListener(closeEvent -> {
                if (closeEvent.closedWith(DialogOutcome.OK)) {
                    City city = closeEvent.getValue("city");
                    String street = closeEvent.getValue("street");
                    String building = closeEvent.getValue("building");
                    Integer zip = closeEvent.getValue("zip");
                    addressField.setValue(city + ", " + street + ", " +
                            building + ", " + zip);
                }
            })
            .show();
}
context help handler

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

EnterPressEvent

EnterPressListener 当用户按下 Enter(回车) 按钮时发送:

@Autowired
private Notifications notifications;

@Subscribe("textField")
public void onTextFieldEnterPress(TextInputField.EnterPressEvent event) {
    notifications.create()
            .withCaption("Enter pressed")
            .show();
}

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

ExpandedStateChangeEvent

ExpandedStateChangeEvent 当组件的折叠状态发生改变时发送。

下面示例为 XML 中 id 是 filterFilter 订阅了该事件:

@Subscribe("filter")
public void onFilterExpandedStateChange(Collapsable.ExpandedStateChangeEvent event) {
    notifications.create()
            .withCaption("Expanded: " + event.isExpanded())
            .show();
}

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

OptionCaptionProvider

OptionCaptionProvider 代理方法支持修改组件中选项的展示标题。

@Install(to = "twinColumn", subject = "optionCaptionProvider")
private String twinColumnOptionCaptionProvider(Employee employee) {
    return employee.getName() + ", salary: " + employee.getSalary();
}
twin column caption provider

编程式用法,调用组件的 setOptionCaptionProvider() 方法。

OptionStyleProvider

OptionsStyleProvider 代理方法支持管理组件中选项的附加样式名。

@Install(to = "ratingField", subject = "optionStyleProvider")
private String ratingFieldOptionStyleProvider(Integer rating) {
    if (rating != null) {
        switch (rating) {
            case 2:
                return "poor";
            case 3:
                return "average";
            case 4:
                return "good";
            case 5:
                return "excellent";
        }
    }
    return null;
}

然后可以在应用程序主题中定义各种样式。创建主题的详细信息参阅 主题。样式名在控制器中提供,加上标识每个选项的前缀,形成 CSS 选择器,示例:

.v-filterselect-item-poor {
    background-color: #f4f1ec;
    color: black;
}

.v-filterselect-item-average {
    background-color: #e5ddce;
    color: black;
}

.v-filterselect-item-good {
    background-color: #ecd7d2;
    color: black;
}

.v-filterselect-item-excellent {
    background-color: #c69c96;
    color: black;
}
combo box style

如需以编程的方式注册选项样式 provider,使用组件的 setOptionStyleProvider() 方法。

ValueChangeEvent

ValueChangeEvent 当用户完成对组件的操作时发送。例如,在按下 Enter 或者组件失去焦点时。支持下列方法:

  • getPrevValue() 返回组件修改前的值。

  • getValue() 返回组件当前值。

@Autowired
private Notifications notifications;

@Subscribe("textField")
public void onTextFieldValueChange(HasValue.ValueChangeEvent event) {
    notifications.create()
            .withCaption("Before: " + event.getPrevValue() +
                    ". After: " + event.getValue())
            .show();
}

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