3.5.2.2.6. 网格布局

在线示例

API 文档

GridLayout 容器将组件放置到网格中。

gui gridlayout

该组件的 XML 名称:grid

使用示例:

  1. <grid spacing="true">
  2. <columns count="4"/>
  3. <rows>
  4. <row>
  5. <label value="Date" align="MIDDLE_LEFT"/>
  6. <dateField dataContainer="orderDc" property="date"/>
  7. <label value="Customer" align="MIDDLE_LEFT"/>
  8. <lookupField dataContainer="orderDc" property="customer" optionsContainer="customersDc"/>
  9. </row>
  10. <row>
  11. <label value="Amount" align="MIDDLE_LEFT"/>
  12. <textField dataContainer="orderDc" property="amount"/>
  13. </row>
  14. </rows>
  15. </grid>

grid 元素:

  • columns – 必须的元素,描述网格列。该元素需要有一个 count 属性或嵌套的 column 元素。

在最简单的情况下,只须使用 count 属性设置列数即可。如果容器宽度以像素或百分比显式定义,则列宽度平均分配。

要非均等地分配界面空间,应为每列定义具有 flex 属性的 column 元素。

网格示例,其中第二列和第四列占用所有剩余的水平空间,第四列占用的空间是第二列的三倍:

  1. <grid spacing="true" width="100%">
  2. <columns>
  3. <column/>
  4. <column flex="1"/>
  5. <column/>
  6. <column flex="3"/>
  7. </columns>
  8. <rows>
  9. <row>
  10. <label value="Date"/>
  11. <dateField dataContainer="orderDc" property="date" width="100%"/>
  12. <label value="Customer"/>
  13. <lookupField dataContainer="orderDc" property="customer" optionsContainer="customersDc" width="100%"/>
  14. </row>
  15. <row>
  16. <label value="Amount"/>
  17. <textField dataContainer="orderDc" property="amount" width="100%"/>
  18. </row>
  19. </rows>
  20. </grid>

如果未定义 flex,或者设置为 0,则根据其内容设置列的宽度,此时需要至少有另一列设置了非零的 flex。在上面的示例中,第一列和第三列将根据最大文本长度设置宽度。

如果需要展示剩余可用空间,整个容器宽度应设置为像素或百分比。否则,将根据内容长度计算列宽,并且 flex 属性不会起作用,也就看不到可用空间了。

  • rows − 必须的元素,包含一组行。每一行都使用自己的 row 元素定义。

row 元素也可以有 flex 属性,与 column 的 flex 定义类似,影响具有给定总高度的网格的垂直可用空间的分布。

row 元素应包含显示在网格当前行单元格中的组件元素。一行中的组件数量不应超过定义的列数,但可以比定义的列数少。 在 grid 容器中的任何组件都可以有 colspanrowspan 属性。这些属性设置相应组件占用的列数和行数。例如,下面就是将 Field3 字段扩展为包含三列的方式:

  1. <grid spacing="true">
  2. <columns count="4"/>
  3. <rows>
  4. <row>
  5. <label value="Name 1"/>
  6. <textField/>
  7. <label value="Name 2"/>
  8. <textField/>
  9. </row>
  10. <row>
  11. <label value="Name 3"/>
  12. <textField colspan="3" width="100%"/>
  13. </row>
  14. </rows>
  15. </grid>

这时,组件会按以下方式放置:

gui gridlayout colspan

可以使用 LayoutClickListener 接口拦截在 GridLayout 区域上的点击。

getComponent() 方法允许通过其列和行索引获取 GridLayout 的子组件:

  1. Button button = (Button) gridLayout.getComponent(0,1);

可以在 GridLayout 中使用键盘快捷键。使用 addShortcutAction() 方法设置快捷方式和要执行的操作:

  1. grid.addShortcutAction(new ShortcutAction("SHIFT-A", shortcutTriggeredEvent ->
  2. notifications.create()
  3. .withCaption("SHIFT-A action")
  4. .show()
  5. ));

grid 的属性

align - caption - captionAsHtml - contextHelpText - contextHelpTextHtmlEnabled - css - description - descriptionAsHtml - enable - box.expandRatio - height - id - margin - spacing - stylename - visible - width
grid 的属性

columns - rows
columns 的属性

count
column 的属性

flex
row 的属性

flex - visible
API

add - addShortcutAction - addLayoutClickListener - getComponent - getComponentNN - getComponents - getMargin - getOwnComponent - getOwnComponents - remove - removeAll - setMargin - setSpacing