文章目录
GridLayout
GridLayout顾名思义,按照网格的形式进行布局。在GridLayout布局的影响下,面板容器会被划分为若干个网格,在进行布局时会按照从左到右,从上到下的顺序填充容器。具体的划分方式需要编码人员手动设置。
网格布局是一种非常强大的布局方式,之所以强大和它相关联的layout data object —— GridData有关。GridData能够单独控制每一个在GridLayout布局下的组件。
numColumns属性
numColumns用于设置划分的表格列数。进行布局时,如果一行的所有列都填充完成后,则会换行填充。如果规定的列还未填充满则不会换行,即使超出边缘。
makeColumnsEqualWidth 属性
该属性用于控制分割的表格每一列是否等宽。
tip: 等宽是划分的列等宽,而不是列中填充的元素
留白属性
和FillLayout一样,GridLayout也有margin类的变量属性,本文不再赘述。感兴趣的读者可以看这篇文章JavaGUI框架之SWT【布局FillLayout】
此外GridLayout将间距划分为水平和垂直间距
gridLayout2.horizontalSpacing = 30;
gridLayout2.verticalSpacing = 50;
GridData
GridData是layout data的一种,专门用于控制GridLayout控制下,组件的布局。
GridData有两种创建形式,一种是无参构造,然后进行参数赋值
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.verticalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalSpan = 2;
另一种是通过构造函数创建。GridData有很多的成员变量,为了减少代码量,GridData提供了丰富的有参构造函数
new GridData (SWT.FILL, SWT.CENTER, true, false));
new GridData (SWT.FILL, SWT.FILL, true, true, 2, 1));
horizontalAlignment属性
horizontalAlignment用于设置控件在单元格中水平方向的对齐格式。其合法参数如下 (设置gridLayout的控件只有b1)
参数 | 描述 | 样式 |
---|---|---|
SWT.BEGINNING(SWT.LEFT) | 将控件放置在单元格左边 | ![]() |
SWT.CENTER | 将控件放置在单元格中间 | ![]() |
SWT.END(SWT.RIGHT) | 将控件放置在单元格右边 | ![]() |
SWT.FILL | 用控件填充满单元格 | ![]() |
verticalAlignment属性
verticalAlignment控制组件在单元格中垂直方向上的布局,其参数和样式均和horizontalAlignment一致,故不在赘述。
widthHint / heightHint
widthHint 指定了控件首选的宽度。如果窗口发生变化,控件的大小会实时变化,自动适应新的窗口。heightHint同理。一般来说,widthHint设定后不会发生改变。
grabExcessHorizontalSpace
grabExcessHorizontalSpace 指定单元格的宽度是否根据窗口(严格来说是父Composite)的大小进行变化。如果 grabExcessHorizontalSpace 设置为true,那么宽度计算遵循以下规则:
- 如果父容器中有额外的水平空间,单元格将会变宽,超过其首选宽度。
- 若父容器中没有足够的水平空间,单元格将收缩直到达到由 GridData.minimumWidth 指定的最小宽度。新宽度将是 “minimumWidth” 与 “首选宽度 - delta” 中的较大值,delta 表示缺少的空间量除以所有占用列的数量。
- 如果父容器被压缩,单元格宽度将按照 GridData.widthHint 指定的首选宽度进行设置。
tip: 以上计算规则都是对单元格的计算,而不是对控件的!只有用控件填充满单元格,才能可视化的观察单元格大小的变化。所以下面所有效果都设置
horizontalAlignment = SWT.FILL
了
规则一
规则二
通过不断的调整numColumns来控制父组件每行能够容纳的button数量。由下图可以看出,一开始水平控件不够的情况加,第三个button长度是被压缩的。随着可用控件变大,button不断的占满可用的控件。
规则三
grabExcessVerticalSpace
与grabExcessHorizontalSpace功能一致,故不在赘述
minimumWidth, minimunHeight 属性
指定控件的最小宽度,这个值只有在grabExcessHorizontalSpace = true时才有用,minimunHeight 同理。
horizontalSpan / verticalSpan 属性
horizontalSpan用于控制控件在水平方向上占据多少单元格。例如gridData.horizontalSpan = 3;
表示组件横跨3个单元格,具体如下所示。
verticalSpan表示垂直方向上跨越多少单元格