SWT Layout - FormLayout

MarginWidth, MarginHeight
离页边宽度和高度,与GridLayout中相似

Display display = new Display ();
Shell shell = new Shell (display);
FormLayout layout= new FormLayout ();
layout.marginHeight = 5;
layout.marginWidth = 5;
shell.setLayout (layout);

FormData
指定了每个widget在FormLayout中怎样排列

很典型地,一个FormData实例在一个合成器内被帮定于各个子control。因为对于一个表格布局其核心思想就是指明各个子control的相对位置,所以不同于其他的布局,给予各个子control提供设置用data非常重要。如果一个给定的control没有一个FormData实例来描述它,则它会被默认为放置于合成器的左上角,而这种位置是你极少期望的。宽度和高度属性用象素来指明一个control的方位。顶部、底部和左右属性较为重要,且都持有一个FormAttachment实例。这些attachment描绘了在一个合成器内control间的关系。
注意:如果多个widgets未指明任何attachment,他们都会在缺省值指定的位置重叠起来

使用FormAttachment指明关系

 

理解FormAttachment是使用表格布局的一个非常重要的方面。就像早先提起的,每一个FormAttachment实例描述了一个control某一面的位置。你可以以两种不同的方式使用FormAttachment

 

首先,你可以使用父合成器的百分比来指明一个FormAttachment。例如,如果一个左侧的FormData被设定为50%,则control的右边际会处于合成器的水平中央。同样地,如果设定顶端边界为75%control会处于合成器自上而下的四分之三处。表6.3总结了用以指定百分比的FormAttachment构造器。以百分比的形式来指明FormAttachment是有用的,但你不能总是应用这种方法。将你的所有control通用百分比方式作说明和用绝对的象素点来指明他们没有太大的区别:因为当合成器被重定大小时,如何快速定位每一个元素会变得相当困难,因为control并不会如你所愿地在该位置上。使用表格式布局的关键点是在于确定control间的相互位置,而这正是FormAttachement所允许的。

基于百分比FormAttachment构造器

构造器

描述

FormAttachment(int numerator)

假定分母为100,意味着参数即被视为一个百分比。

仅在SWT 3.0中可用。

FormAttachment(int numerator, int offset)

假定分母为100,意味着参数即被视为一个百分比。

偏移量offset是在百分比定位的基础上再行偏移的象素数目。

FormAttachment(int numerator, int denominator, int offset)

假定分母为denominator,意味着参数即被视为一个百分比。

偏移量offset是在百分比定位的基础上再行偏移的象素数目。


FormAttachment第二系列的构造器是基于对其他control的参照。它们常常将一个control的边缘与相邻的control相对定位。通过为button1设定FormData右属性到一个基于button2而构建的FormAttachment,你可以说button1应该总是定位与button2的右侧。将你的绝大多数control依照这种方式去定位有多种好处。你的布局代码目的就变得很容易理解:在过去的象素或是百分壁基础上的那个control与哪个control相邻的表达方式被取代后,就变得很明显了,例如:名为foocontrol应该位于工具条之下;其次,表格式布局也容易维持你的这种布局意图。无论合成器的尺寸如何大小变化,它总是能够维持其正确的相对位置。

FormData formData = new FormData();
formData.top = new FormAttachment(30,70,10);
button1.setLayoutData(formData);
指的是加入该Composite含有70个单元则该button1的顶部位于Composite从上数30个单元再加10个像素的位移


作为指定相对位置之用的FormAttachment构造器有若干种形式,具体总结如下

构造器

描述

FormAttachment(Control control)

将现有小部件添于邻接的control一侧的参数。

FormAttachment(Control control, int offset)

将现有小部件添于邻接的control一侧的参数,并且有offset数量象素的偏移量。

FormAttachment(Control control, int offset, int alignment)

排列alignment必须为 SWT.TOP SWT.BOTTOMSWT.LEFT SWT.RIGHTSWT.CENTER其中之一。

将现有小部件添于邻接的control一侧的参数,并且有offset数量象素的偏移量。


注意:对于top和left的offset应该为正数,对于bottom和right的offset应该为负数


相对于另一个 widget进行定位

FormData formData = new FormData();
formData.top = new FormAttachment(20,0);
button1.setLayoutData(formData); 
FormData formData2 = new FormData();
formData2.top = new FormAttachment(button1,10);
button2.setLayoutData(formData2);

上面这段代码的意思就是首先将button1顶部放置在距离Composite顶部20%处,然后将button2的顶部放置在button1下10个像素位移处,当窗口大小改变时,button1会一直随着改变并处于20%处,而button2也一直在button1下方10个像素处

formData2.top = new FormAttachment(button1,0,SWT.TOP); 指定button2的顶部和button1相同也处于20%处


FormData formData = new FormData(50,50);
formData.top = new FormAttachment(20,0);
button1.setLayoutData(formData);
FormData formData2 = new FormData();
FormData2.left = new FormAttachment(button1,5);
formData2.top = new FormAttachment(button1,0,SWT.TOP);
button2.setLayoutData(formData2);

上面的代码说明button1大小为50*50像素,距离顶部20%,button2的左边与button1距离差5个像素,顶部与button1相同
若将上面改为formData.top = new FormAttachment(button1,0,SWT.CENTER);则button2在button1左边5个像素处且在垂直方向上处于button1的中间

注意:千万不要定义重复的attachment,如定义button2的左边连着button1的右边,又定义button1的右边连着button2的左边,这样会导致未定义错误,所以一定要确定你的weidget没有重复限制他们的位置,仅定义 需要限制位置的widget



参考: http://www.eclipse.org/articles/Understanding%20Layouts/Understanding%20Layouts.htm


















你可能感兴趣的:(SWT Layout - FormLayout)