3.5.1.1.3. 界面控制器注解

控制器上的类级别的注解用于向框架提供界面相关的信息。一部分注解适用于任何类型的界面,也有一部分仅用于实体编辑或查找界面。

以下示例演示了常见的界面注解的用法:

[source, java]1

  1. package com.company.demo.web.screens;
  2.  
  3. import com.haulmont.cuba.gui.screen.*;
  4.  
  5. @UiController("demo_FooScreen")
  6. @UiDescriptor("foo-screen.xml")
  7. @LoadDataBeforeShow
  8. @MultipleOpen
  9. @DialogMode(forceDialog = true)
  10. public class FooScreen extends Screen {
  11. }
  • @UiController 注解表示该类是一个界面控制器。注解的值是界面的 ID,可用于从主菜单或以编程方式打开界面时引用界面。
  • @UiDescriptor 注解将界面控制器连接到界面 XML 描述。注解的值指定描述文件的路径。如果该值仅包含文件名,则假定该文件与控制器类位于同一个包中。
  • @LoadDataBeforeShow 注解表示在显示界面之前应自动触发所有数据加载器。准确的说,数据会在调用所有的 BeforeShowEvent 监听器之后,但是在 AfterShowEvent 监听器之前加载。如果需要在界面显示之前的加载数据时刻执行某些操作,删除此注解或将其值设置为 false,这样可以在 BeforeShowEvent 事件监听器中使用 getScreenData().loadAll() 方法或个别加载器的 load() 方法来手动加载数据。
  • @MultipleOpen 注解表示可以从主菜单多次打开界面。默认情况下,当用户点击主菜单项时,框架会检查是否已在主窗口标签页上打开相同类和 ID 的界面。如果找到此类界面,则会关闭该界面,并在新标签页中打开新的界面实例。当存在 @MultipleOpen 注解时,不执行任何检查,只在新标签页中打开一个新的界面实例。

可以通过覆盖界面控制器中的 isSameScreen() 方法,提供自定义的界面实例同一性检查方法。

  • @DialogMode 注解允许指定界面以对话框窗口方式打开时的尺寸和行为。它对应于界面描述<dialogMode> 元素,可以替代使用。对于除 forceDialog 之外的所有参数,XML 中的设置优先于注解。forceDialog 参数会合并生效,即:只要在注解或 XML 其中之一将其设置为 true,界面就总是以对话框的方式打开。

针对查找界面的注解示例:

  1. package com.company.demo.web.screens;
  2. import com.haulmont.cuba.gui.screen.*;
  3. import com.company.demo.entity.Customer;
  4. // common annotations
  5. @UiController("demo_Customer.browse")
  6. @UiDescriptor("customer-browse.xml")
  7. @LoadDataBeforeShow
  8. // lookup-specific annotations
  9. @LookupComponent("customersTable")
  10. @PrimaryLookupScreen(Customer.class)
  11. public class CustomerBrowse extends StandardLookup<Customer> {
  12. }
  • @LookupComponent 注解指定一个 UI 组件的 ID,这个组件用于获取查找界面的返回值。

可以通过覆盖界面控制器的 getLookupComponent() 方法以编程方式指定查找界面,而不是使用注解。

  • @PrimaryLookupScreen 注解表示此界面是指定实体类型的默认查找界面。注解比 {entity_name}.lookup / {entity_name}.browse 名称约定具有更高的优先级。

编辑器界面特有的注解示例:

  1. package com.company.demo.web.data.sort;
  2. import com.haulmont.cuba.gui.screen.*;
  3. import com.company.demo.entity.Customer;
  4. // common annotations
  5. @UiController("demo_Customer.edit")
  6. @UiDescriptor("customer-edit.xml")
  7. @LoadDataBeforeShow
  8. // editor-specific annotations
  9. @EditedEntityContainer("customerDc")
  10. @PrimaryEditorScreen(Customer.class)
  11. public class CustomerEdit extends StandardEditor<Customer> {
  12. }

不使用注解的话,可以通过覆盖界面控制器的 getEditedEntityContainer() 方法以编程方式指定容器。

  • @PrimaryEditorScreen 注解表示此界面是指定实体类型的默认编辑界面。 注解比 {entity_name}.edit 名称约定具有更高的优先级。