3.6.1.3.1. AbstractFrame

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

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

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

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

    @Inject
    private Table someTable;
    
    @Override
    public void init(Map<String, Object> params) {
        someTable.addGeneratedColumn("someColumn", new Table.ColumnGenerator<Colour>() {
            @Override
            public Component generateCell(Colour entity) {
                ...
            }
        });
    }
  • getMessage(), formatMessage() – 用来从语言包获取本地化翻译消息的方法,在 XML 描述中定义,是调用相应消息接口的捷径。

  • openFrame() – 根据在 screens.xml 文件中注册的标识符加载一个子界面框架。如果调用者给这个方法传递了一个容器组件的参数,子界面框架会在这个容器内打开。此方法返回子框架控制器。示例:

    @Inject
    private BoxLayout container;
    
    @Override
    public void init(Map<String, Object> params) {
        SomeFrame frame = openFrame(container, "someFrame");
        frame.setHeight("100%");
        frame.someInitMethod();
    }

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

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

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

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

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

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

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

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

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

    CustomerEdit editor = openEditor("sales$Customer.edit", customer, WindowManager.OpenType.THIS_TAB);
    editor.addCloseWithCommitListener(() -> {
        // do something
    });
  • showMessageDialog() – 显示消息对话框。

  • showOptionDialog() – 显示带消息的对话框,并且为用户提供一些功能操作。操作通过 Action 的数组定义,这些操作会作为按钮显示。

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

    showOptionDialog("PLease confirm", "Are you sure?",
            MessageType.CONFIRMATION,
            new Action[] {
                new DialogAction(DialogAction.Type.YES) {
                    @Override
                    public void actionPerform(Component component) {
                        // do something
                    }
                },
                new DialogAction(DialogAction.Type.NO)
            });
  • showNotification() – 显示弹出消息。

  • showWebPage() – 在浏览器打开特定网页。