3.6.1.3.1. AbstractFrame

AbstractFrame 是控制器类结构的根节点基类。以下是其主要方法的介绍:

  • init() 在创建了 XML 描述中的所有组件之后,但是在界面显示之前会被调用。

init() 接受一组以 map 类型传递的参数,可以用在控制器里面。这些参数可以通过调用界面的方法传递(使用 openWindow(), openLookup() 或者 openEditor() 方法),或者在界面注册文件 screens.xml 里面定义。

如果需要初始化界面组件,必须实现 init() 方法,示例:

  1. @Inject
  2. private Table someTable;
  3. @Override
  4. public void init(Map<String, Object> params) {
  5. someTable.addGeneratedColumn("someColumn", new Table.ColumnGenerator<Colour>() {
  6. @Override
  7. public Component generateCell(Colour entity) {
  8. ...
  9. }
  10. });
  11. }
  • getMessage(), formatMessage() – 用来从语言包获取本地化翻译消息的方法,在 XML 描述中定义,是调用相应消息接口的捷径。
  • openFrame() – 根据在 screens.xml 文件中注册的标识符加载一个子界面框架。如果调用者给这个方法传递了一个容器组件的参数,子界面框架会在这个容器内打开。此方法返回子框架控制器。示例:
  1. @Inject
  2. private BoxLayout container;
  3. @Override
  4. public void init(Map<String, Object> params) {
  5. SomeFrame frame = openFrame(container, "someFrame");
  6. frame.setHeight("100%");
  7. frame.someInitMethod();
  8. }

但这并不是说非要在 openFrame() 方法中带入容器参数,其实也可以先加载子界面框架然后再添加到所需的容器中:

  1. @Inject
  2. private BoxLayout container;
  3. @Override
  4. public void init(Map<String, Object> params) {
  5. SomeFrame frame = openFrame(null, "someFrame");
  6. frame.setHeight("100%");
  7. frame.someInitMethod();
  8. container.add(frame);
  9. }
  • openWindow(), openLookup(), openEditor() – 分别用来打开简单界面、查找界面、以及编辑界面。方法会返回这些界面的控制器。

对于对话框模式,openWindow() 方法可以带参数调用,示例:

  1. @Override
  2. public void actionPerform(Component component) {
  3. openWindow("sec$User.browse", WindowManager.OpenType.DIALOG.width(800).height(300).closeable(true).resizable(true).modal(false));
  4. }

这些参数只有在不与窗口更高优先级的参数冲突的时候才会生效。这些高优先级的参数可以通过界面控制器的 getDialogOptions() 方法设置,或者在界面的 XML 描述中定义:

  1. <dialogMode forceDialog="true" width="300" height="200" closeable="true" modal="true" closeOnClickOutside="true"/>

如果需要在界面关闭之后做一些操作,可以添加 CloseListener,示例:

  1. CustomerEdit editor = openEditor("sales$Customer.edit", customer, WindowManager.OpenType.THIS_TAB);
  2. editor.addCloseListener((String actionId) -> {
  3. // do something
  4. });

只有在打开的窗口通过 Window.COMMIT_ACTION_ID 名称的操作(比如 OK 按钮)关闭的时候才需要使用 CloseWithCommitListener 来处理关闭事件:

  1. CustomerEdit editor = openEditor("sales$Customer.edit", customer, WindowManager.OpenType.THIS_TAB);
  2. editor.addCloseWithCommitListener(() -> {
  3. // do something
  4. });
  • showMessageDialog() – 显示消息对话框。
  • showOptionDialog() – 显示带消息的对话框,并且为用户提供一些功能操作。操作通过 Action 的数组定义,这些操作会作为按钮显示。

推荐使用 DialogAction 对象来显示标准按钮,比如 OKCancel 或者其它按钮,示例:

  1. showOptionDialog("PLease confirm", "Are you sure?",
  2. MessageType.CONFIRMATION,
  3. new Action[] {
  4. new DialogAction(DialogAction.Type.YES) {
  5. @Override
  6. public void actionPerform(Component component) {
  7. // do something
  8. }
  9. },
  10. new DialogAction(DialogAction.Type.NO)
  11. });
  • showNotification() – 显示弹出消息。
  • showWebPage() – 在浏览器打开特定网页。

API

formatMessage() - getMessage() - init() - openFrame() - openEditor() - openLookup() - openWindow() - showMessageDialog() - showNotification() - showOptionDialog() - showWebPage()