3.5.17. 主窗口布局

下面描述的机制允许使用 CUBA 通用 UI 技术设计应用程序主窗口布局,即通过创建 XML 描述和 Java 控制器、同时使用UI 组件数据源

主窗口由具有 mainWindow 标识符的特定界面定义。它的控制器应该派生自 AbstractMainWindow 类。

除了标准 UI 组件之外,主窗口中还可以使用以下特殊组件:

  • AppMenu - 主要应用程序菜单。

  • FoldersPane - 应用程序和搜索文件夹面板

  • AppWorkArea - 工作区,在 THIS_TABNEW_TABNEW_WINDOW 模式下打开界面所需的组件。

  • UserIndicator - 显示当前用户名称的字段,也可以用于选择替换用户(如果有)。

setUserNameFormatter() 方法允许以不同于 User 实例名称的格式显示用户名:

  1. userIndicator.setUserNameFormatter(value -> value.getName() + " - [" + value.getEmail() + "]");

userIndicator

  • NewWindowButton - 一个按钮,用于在单独的浏览标签页中打开新的应用程序主窗口。

  • LogoutButton - 应用程序注销按钮。

  • TimeZoneIndicator - 显示当前用户时区的标签。

  • FtsField - 全文搜索框。

要定义特定组件,请在界面上添加 xmlns:main 命名空间:

  1. <window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
  2. xmlns:main="http://schemas.haulmont.com/cuba/mainwindow.xsd"
  3. class="com.company.sample.gui.MainWindow">
  4. <layout>
  5. </layout>
  6. </window>

AppWorkArea 组件用于显示应用程序界面。如果cuba.web.appWindowMode应用程序属性为 TABBED (默认值),则工作区显示带有打开界面的 TabSheet。否则只打开单个应用程序界面。cuba.web.mainTabSheetModecuba.web.managedMainTabSheetMode应用程序属性定义切换标签页时如何处理标签页内容。当没有界面被打开时,工作区显示 initialLayout 元素中定义的组件:

  1. <main:workArea id="workArea" width="100%" height="100%">
  2. <main:initialLayout spacing="true" margin="true">
  3. <!-- content shown when there are no open screens -->
  4. </main:initialLayout>
  5. </main:workArea>

在打开第一个应用程序界面时从 AppWorkArea 中删除初始界面(initialLayout),在所有界面关闭后初始界面又被重新添加上。可以添加 AppWorkArea.StateChangeListener 来处理工作区中初始界面和应用程序界面之间切换。例如,这种使用这个监听器刷新初始界面的数据。

平台提供两个标准主窗口实现。顶部有横向菜单的默认主窗口,其 XML 描述在 /com/haulmont/cuba/web/app/mainwindow/mainwindow.xml 中,对应的控制器类是 AppMainWindow 。另一个可用的模板包含垂直侧边菜单

标准实现可以在项目中被继承,和任何其它应用程序界面一样。继承界面的示例:

  1. <window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
  2. xmlns:ext="http://schemas.haulmont.com/cuba/window-ext.xsd"
  3. extends="com/haulmont/cuba/web/app/mainwindow/mainwindow.xml"
  4. class="com.haulmont.cuba.web.app.mainwindow.AppMainWindow">
  5. <layout>
  6. <vbox ext:index="0">
  7. <label value="This is my main window!" stylename="h2"/>
  8. </vbox>
  9. </layout>
  10. </window>

此界面应在web-screens.xml文件中注册,并带有 mainWindow 标识符。

扩展主界面的最简单方法是在 CUBA Studio 中完成:选中 CUBA 项目视图的 Generic UI 部分,在右键菜单中点击 New,然后为新的主界面选择模板。新的 ext-mainwindow.xml 文件会在 Web 模块中被创建,并自动被注册在 web-screens.xml 中。

CUBA 平台提供两个标准主窗口布局模板:横向菜单和侧边菜单。标准主窗口实现可以被自定义窗口实现完全替换。例如:

  1. <window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
  2. xmlns:main="http://schemas.haulmont.com/cuba/mainwindow.xsd"
  3. class="com.company.sample.gui.MainWindow">
  4. <layout expand="middlePanel">
  5. <hbox margin="true"
  6. stylename="gray"
  7. width="100%">
  8. <label align="MIDDLE_CENTER"
  9. value="Header"/>
  10. </hbox>
  11. <main:menu width="100%"/>
  12. <split id="middlePanel"
  13. orientation="horizontal"
  14. pos="80"
  15. width="100%">
  16. <main:workArea id="workArea"
  17. height="100%"
  18. width="100%">
  19. <main:initialLayout stylename="red">
  20. <label align="MIDDLE_CENTER"
  21. value="Work Area (Initial Layout)"/>
  22. </main:initialLayout>
  23. </main:workArea>
  24. <main:foldersPane height="100%"
  25. stylename="blue"
  26. width="100%"/>
  27. </split>
  28. <hbox margin="true"
  29. stylename="gray"
  30. width="100%">
  31. <label align="MIDDLE_CENTER"
  32. value="Footer"/>
  33. </hbox>
  34. </layout>
  35. </window>

生成的主窗口如下所示:

main window 1

在这个完全自定义的主窗口中打开应用程序界面:

main window 2

cuba.web.showBreadCrumbs 应用程序属性允许隐藏打开的界面上方的导航面板。