FormLayout(一)

 象其它的layout类一样,FormLayout用的data类是:FormData。FormData用另外一个类来控制窗口小部件的大小和位置: FormAttachment.一个FormData最多用4个FormAttachment,它们分别对应这个小部件的4个面:顶部,底部,左边和右边。FormAttachment定义了小部件在parent composite或是这个composite里其它部件的位置。

FormAttachment计算位置和大小的方法:

y=ax+b
 

在这个等式中,在数学上y代表的是纵坐标,x是横坐标值.a是斜率,b是偏移量.按照FormAttachment的规则,y是高,x是宽度,a是一个相对其它部件的百分率,b是偏移量.FormAttachment实例中的每个数据成员分别代表这些值.

以下(表一)是FormAttachment的数据成员表和相应的意思:

表一:FormAttachment数据成员

Attribute

Description

int alignment

指定是以另外一个部件的哪一边为基准的.可能的值是:SWT.TOP, SWT.CENTER, 和 SWT.BOTTOM.默认是以最近的一边为基准.

Control control

指定FormAttachment是以哪个部件为参照物.

int denominator

指定分母.默认值为100

int numerator

指定分子

int offset

指定离composite边界或部件的边界的偏移量.单位是象素.

 

FormAttachment 拥有5个构造函数,没有一个是空的,它们如下表(表二)所示:

表二:FormAttachment的构造函数:

Constructor

Description

FormAttachment(Control control)

以另外的某个部件为参照物.

FormAttachment(Control control, int offset)

以另外的某个部件为参照物,加上偏移量.

FormAttachment(Control control, int offset, int alignment)

以另外的某个部件为参照物,加上偏移量和alignment

FormAttachment(int numerator)

设定分子.分母为100,没有偏移量

FormAttachment(int numerator, int offset)

指定分子和偏移量和100的分母

FormAttachment(int numerator, int denominator, int offset)

特定的分子,分母,偏移量

FormData最多包含4个FormAttachment实例,每个对应了与它联系的部件的一边.另外,FormData也可以指定宽和高.表四列出了FormData的数据成员:

Attribute

Description

FormAttachment bottom

The FormAttachment corresponding to the bottom side of the control.

这个FormAttachment用来指定部件的底部位置

int height

这个部件的高度.单位为象素.

FormAttachment left

这个FormAttachment用来指定部件的左部位置

FormAttachment right

这个FormAttachment用来指定部件的右部位置

FormAttachment top

这个FormAttachment用来指定部件的顶部位置

int width

这个部件的宽度.单位为象素.

当你生成一个FormData对象,你可以自己传给它宽和高的值.如果你没有指定FormAttachment对象,部件会自动以parent composite的上边界和左边为起始边界.如果你这样定义了多个部件,它们会都在composite的左上角.

FormLayout有两个数据成员 marginHeight和marginWidth,用来以象素为单位来指定大小.它们用来指定包围composite里所有内容的空白. marginHeight对应的是顶部和底部的空白大小,marginWidth对应的是左边和右边的空白大小.空白的默认值是0.

以上的话如果你看得不大懂也没有关系,我们按照具体的例子来看就知道了.

用到FormLayout的最简单的例子就是一个窗口里一个按钮,并且不用FormData.

//FormLayoutSimple.java

import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.SWT;

public class FormLayoutSimple {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FormLayout());
new Button(shell, SWT.PUSH).setText("Button");
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
运行后是这个样子:
你可以通过设定marginHeight和marginWidth值改变周围的空白.
代码象这样:
FormLayout layout = new FormLayout();
layout.marginHeight = 5;
layout.marginWidth = 10;
shell.setLayout(layout);
结果象这样:
但是,只有用FormData和FormAttachment你才能做更多的事.

试着使用FormData,但是不用FormAttachments,FormData有公共成员属性height和width用来改变按钮的大小.

Button button = new Button(shell, SWT.PUSH);
button.setText("Button");
FormData data = new FormData();
data.height = 50;
data.width = 50;
button.setLayoutData(data);
结果象这样:
按钮在窗口中的位置是静态的,也就是说改变窗口的大小不影响按钮的位置我们举个例子,比如说,你
希望这个按钮始终离窗口的右边界50个象素的话,你必须在你刚刚产生的FormData上添加一个
FormAttachment.因为你现在要指定这个按钮的右边的具体情况了.所以你现在要设置FormData的
right属性,还记得FormData的right属性是一个FormAttachment对象吧.
当与parent composite产生联系时,如果是顶部和左边的话,分子设置为0,如果是顶部和右边的话
分子设置为100,分别代表了0%和100%.可以在构造函数中设置分子.我们现在把分子设置为100,偏
移量设置为-50.我们不需要设置分母,因为它的默认大小是100.代码象这样:

data.right = new FormAttachment(100, -50);

现在编译并运行程序,按钮离右边刚好50个象素.缩小窗口也不会有任何影响,按钮离右边始终是50象素.

改变窗口大小:

现在按钮总是维持它离右边50个象素,但是我们需要它始终保持位置不变,并且随着窗口的伸缩而伸缩.要实现这个要求,我们必须设置它的左边,所以可以这样实现:

data.left = new FormAttachment(0, 10);

把分子的值设置为0表示它是以窗口的最左边来计算偏移量的.偏移量设置为10表示它始终离窗口最左边10个象素.重新编译运行程序,初始界面好象和刚刚差不多,但是改变窗口大小就可以看到按钮离窗口左边的大小始终没有改变.

 

离左边和离右边的值已经设置好了,所以它的宽度自然也定下来了,我们可以把原来FormData设置的按钮宽度那行代码删掉了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值