3.5.4.2.1. 列表组件操作

框架为实现了 ListComponent 接口的可视化组件(DataGridTableGroupTableTreeTableTree)提供了一组标准操作,这些操作在 com.haulmont.cuba.gui.actions.list 包中。

在表格中使用标准操作的示例:

<groupTable id="customersTable" width="100%" dataContainer="customersDc">
    <actions>
        <action id="create" type="create"/>
        <action id="edit" type="edit"/>
        <action id="remove" type="remove"/>
    </actions>
    <columns>
        <column id="name"/>
        <column id="email"/>
    </columns>
    <buttonsPanel>
        <button id="createBtn" action="customersTable.create"/>
        <button id="editBtn" action="customersTable.edit"/>
        <button id="removeBtn" action="customersTable.remove"/>
    </buttonsPanel>
</groupTable>

标准列表组件操作包括以下类型:

  • create - 类型由 com.haulmont.cuba.gui.actions.list.CreateAction 类实现。它被设计用于使用其默认编辑界面创建新实体。

  • edit - 类型由 com.haulmont.cuba.gui.actions.list.EditAction 类实现。它被设计用于使用其默认编辑界面编辑所选实体。

  • remove - 类型由 com.haulmont.cuba.gui.actions.list.RemoveAction 类实现。它被设计用于删除所选实体。

  • add - 类型由 com.haulmont.cuba.gui.actions.list.AddAction 类实现。它被设计用于从默认查找界面选取实体然后将其添加到关联的数据容器。这个操作典型的用例是用来为多对多集合添加实体。

  • exclude - 类型由 com.haulmont.cuba.gui.actions.list.ExcludeAction 类实现。它被设计用于从集合数据容器中删除实体但是不从数据库删除。这个操作典型的用例是从多对多集合中删除实体。

  • refresh - 类型由 com.haulmont.cuba.gui.actions.list.RefreshAction 类实现。它被设计用于重新加载列表组件使用的数据容器。

  • excel - 类型由 com.haulmont.cuba.gui.actions.list.ExcelAction 类实现。它被设计用于将列表组件内容输出到 XLS 文件。

标准操作为基本参数(题、图标和快捷键)提供默认值以及执行时的默认行为。可以在 XML 中为基本参数提供自己的值,就像其它任何操作一样。例如,可以指定自定义图标:

<action id="create" type="create" icon="USER"/>

要自定义执行行为,应该订阅操作的 ActionPerformedEvent。如果提供了自己的操作监听器,则所有标准操作都不会执行。这意味着 自定义的 ActionPerformedEvent 处理器已经覆盖了默认的操作行为。

例如,以下代码将覆盖默认的 create 操作行为,以使用以模式对话框打开的特定界面创建 Customer 实体:

public class CustomerBrowse extends StandardLookup<Customer> {
    @Inject
    private GroupTable<Customer> customersTable;
    @Inject
    private ScreenBuilders screenBuilders;

    @Subscribe("customersTable.create")
    protected void onCustomersTableCreateActionPerformed(Action.ActionPerformedEvent event) {
        screenBuilders.editor(customersTable)
                .newEntity()
                .withScreenClass(CustomerEdit.class)     // specific editor screen
                .withLaunchMode(OpenMode.DIALOG)        // open as modal dialog
                .build()
                .show();
    }
}

跟自定义 create 一样,可以对 edit 的行为进行定制。对有关更多详细信息,请参阅 ScreenBuilders bean 描述.

add 行为使用的是 ScreenBuilders bean,所以可以按照下面的方式进行定制:

public class CustomerEdit extends StandardEditor<Customer> {
    @Inject
    private ScreenBuilders screenBuilders;
    @Inject
    private Table<Employee> accountableTable;

    @Subscribe("accountableTable.add")
    protected void onAccountableTableAddActionPerformed(Action.ActionPerformedEvent event) {
        screenBuilders.lookup(Employee.class, this)
                .withListComponent(accountableTable)
                .withScreenClass(EmployeeBrowse.class)   // specific editor screen
                .withLaunchMode(OpenMode.DIALOG)        // open as modal dialog
                .build()
                .show();
    }
}