3.6.1.1.3. 查找界面

查找界面设计用来选择并且返回实体实例或者实体列表。可视化组件中的 PickerFieldLookupPickerField 使用的标准 LookupAction 就是调用查找界面来选择相关的实体。

当通过 openLookup() 方法调用查找界面的时候,界面会包含一个面板以及用来选择的一些按钮。当用户选择了一个实例或者多个实例的时候,查找界面调用之前传递给它的处理器函数,从而能将查找结果返回给调用者的代码。当通过 openWindow() 方法或者比如说通过主菜单打开查找界面的时候,用来选择的面板不会显示,查找界面会被有效的转化成一个简单界面

查找界面的控制器必须从 AbstractLookup 类继承。界面 XML 描述中的 lookupComponent 属性必须指向一个组件(比如表格),从这个组件中选择需要的实体实例作为查找结果。

可以在 Studio 里使用 Entity browser 或者 Entity combined screen 模板来创建实体的查找界面。

默认情况下,LookupAction 会使用注册在 screens.xml 文件中的一个查找界面,注册的标识符是 {entity_name}.lookup 或者 {entity_name}.browse,比如,sales$Customer.lookup。所以在使用上面提到的组件的时候,确保有个查找界面已经注册。Studio 会使用 {entity_name}.browse 标识符注册浏览界面,所以这些界面会被默认当作查找界面使用。

自定义查找界面样式和行为
  • 需要更改项目中所有查找界面的查找按钮面板(SelectCancel 按钮),可以创建一个界面子框架(frame)并且使用 lookupWindowActions 标识符注册。系统默认的界面框架在 /com/haulmont/cuba/gui/lookup-window.actions.xml。自定义的界面框架必须包含一个链接到 lookupSelectAction 行为的按钮(当界面作为查找界面打开时会自动添加这个按钮)。

  • 需要在某些特定的界面替换查找按钮面板,只需要在界面中创建一个链接到 lookupSelectAction 行为的按钮,这样的话平台不会添加默认的按钮面板。示例:

    <layout expand="table">
        <hbox>
            <button id="selectBtn" caption="Select item"
                    action="lookupSelectAction"/>
        </hbox>
        <!-- ... -->
    </layout>
  • 需要用自定义的操作替换掉默认的选择动作时,只需要在控制器添加自定义的 action:

    @Override
    public void init(Map<String, Object> params) {
        addAction(new SelectAction(this) {
            @Override
            protected Collection getSelectedItems(LookupComponent lookupComponent) {
                Set<MyEntity> selected = new HashSet<>();
                // ...
                return selected;
            }
        });
    }

    使用 com.haulmont.cuba.gui.components.SelectAction 作为 action 的基类,如果需要的话,重写里面的方法。