SWT布局管理器(Standard Wdiget Toolkit)
为了设置组件的大小和位置,可以通过编程的方式来完成,但是当窗口大小发生变化时,需要添加监听器进行控制,另外一种方式就是使用布局管理器来管理组件的布局。SWT提供了四种布局管理器,分别为FillLayout、RowLayout、GridLayout和FormLayout。布局管理器是Plugable的,为组件设置布局管理器通过setLayout(Layout)方法完成,可以通过实现Layout,来添加自定义的布局管理器。
FillLayout:FillLayout是最基本的布局管理器。当将组件添加到屏幕时,FillLayout安排他们的水平成行,垂直成列。它将组件平均的放置,以使组件填满Composite。FillLayout不包含布局数据,所以只需要为其定义是水平摆放还是垂直摆放组件。
当希望均匀的摆放组件,例如标签列表,按钮列表时,可以使用这个布局管理器。
FillLayout布局管理器的一个优点是当改变屏幕的大小时,组件仍然是均匀放置的。GridLayout也可以实现这样的效果,但是需要做更多额外的工作。
下面的代码演示了如果使用FillLayout布局管理器来排放标签,注:不需要为标签设置任何属性,布局管理器会处理大小,位置等属性。
shell.setLayout(new FillLayout(SWT.VERTICAL));
Label label0 = new Label(shell, SWT.NONE);
label0.setText("Instructions:");
......
Label label5 = new Label(shell, SWT.NONE);
label5.setText("5. Click on OK");
运行结果如下所示:
http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/FillLayout1.png--->改变窗口大小http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/FillLayout2.png
RowLayout:RowLayout布局管理器将组件按行排列。可以定义RowLayout的横向或者纵向,以确定组件是横排还是纵排。RowLayout还可以设置一些其他的属性,例如wrap,pack,margin和spacing。
如果将pack属性设置为true,那么所有的组件保持原来的自然大小,并且尽可能的被放在最左边或者最上边。这是和FillLayout的主要区别。例如上面的例子如果使用RowLayout,那么初始状态和FillLayout相似,但是当改变屏幕大小时,所有的组件靠近最上边,而不是均匀分布。
http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/RowLayout1.png
RowLayout的另一个特点是wrap属性,当wrap属性设置为true的时候,如果一行对于窗口来说太长的时候,布局管理器会将调整成两行,例如在上面的例子中,如果将窗口变得很小,它们就会重叠。
http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/FillLayout3.png
而如果使用RowLayout的话,它们会自动的编成两列以适应窗口:
http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/RowLayout2.png
当将pack设置为false时,所有的组件将会保持相同的size,wrap为true时,由窗口决定是否排列为一行还是多行。
shell.setLayout(new RowLayout(SWT.VERTICAL));
RowLayout rowLayout = new RowLayout();
rowLayout.pack = false;
shell.setLayout(rowLayout);
Button b1 = new Button(shell, SWT.PUSH);
b1.setText("Address");
......
Button b6 = new Button(shell, SWT.PUSH);
b6.setText("OK");
此外,RowLayout还可以设置justify,spacing,以及四个方向的margin属性。
GridLayout:GridLayout布局管理器提供了比RowLayout和FillLayout更多的灵活性,但是这种灵活性是需要付出代价的。GridLayout需要计算GridData和很多field的值,因为只有这样做才可以获取GridLayout布局管理器的优点。
最重要的属性要数numColumn和makeColumnsEqualWidth了,可以通过它们确定组件的列数,以及它们是否要保持相同的大小还是保持自身的大小。应该总是使列的数量和在一行中可以放置的最多的个数相同,例如有的行放置5个,有的行放置3个,那么应该将其设置为5.一旦确定列的个数后,就可以随意设置组件跨的列数了。例如三个组件的行中,可以设置一个组件跨三行,或者两个组件跨两行。这样可以非常灵活的放置组件。
RowLayout对应的RowData是可用的,但是很多时候是不需要的。和RowLayout相反,GridData对象对于GridLayout布局管理器来说非常的重要。最重要的方面就是需要使用GridData对象的用于控制屏幕变化时组件行为的属性。
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
shell.setLayout(gridLayout);
Label label1 = new Label(shell, SWT.NONE);
label1.setText("Name:");
Text text1 = new Text(shell, SWT.BORDER);
Label label2 = new Label(shell, SWT.NONE);
label2.setText("Age:");
Text text2 = new Text(shell, SWT.BORDER);
Label label3 = new Label(shell, SWT.NONE);
label3.setText("Gender:");
Text text3 = new Text(shell, SWT.BORDER);
Button button = new Button(shell, SWT.CHECK);
button.setText("Have you been employed in the past six months?");
GridData data = new GridData();
data.widthHint = 60;
label1.setLayoutData(data);
data = new GridData();
data.widthHint = 60;
label2.setLayoutData(data);
data = new GridData();
data.widthHint = 60;
label3.setLayoutData(data);
GridData data2 = new GridData(GridData.FILL_HORIZONTAL);
text1.setLayoutData(data2);
data2 = new GridData(GridData.FILL_HORIZONTAL);
text2.setLayoutData(data2);
data2 = new GridData(GridData.FILL_HORIZONTAL);
text3.setLayoutData(data2);
GridData data3 = new GridData();
data3.horizontalSpan = 2;
button.setLayoutData(data3);
上面的代码中,将label的宽度都设置为60个像素,然后对文本框设置了水平填充,即文本框会填充屏幕的水平空间。并设置了button跨两列。注意,为每个组件定义了一个独立的GridData对象。
还可以为GridData设置水平对齐horizontalAlignment可选的值包括:BEGINNING(左对齐),CENTER,END,FILL。以及是否获取生育的空间grabExcessHorizontalSpace和grabExcessVerticalSpace。
FormLayout:FormLayout是最新的布局管理器,并且关于它是否比GridLayout更好还存在一定的争议。不管怎么说,FormLayout提供了与GridLayout风格不同的灵活性。
在使用GridLayout之前,必须提前计划,因为组件的添加的顺序就是组件的显示顺序。但是使用FormLayout时,每个组件每个组件和其他组件都是独立的。
在FormLayout中,FormData是必须的,如果不为组件分配FormData对象,那么它们会被放置在相同的默认区域,叠放在一起。每个组件都具有独立的FormData对象,通过FormAttachments来进行摆放。这样做的想法是可以将组件的边缘放在窗口的任意位置。可以为组件的每个边缘设置位置。可以将其定义为相对其他组件的百分比,偏移量。
参考资料:
SWT主页:http://www.eclipse.org/swt
SWT小例子:http://www.eclipse.org/swt/snippets/
SWT例子:http://www.eclipse.org/swt/examples.php
SWT文档:http://www.eclipse.org/swt/docs.php
Getting Started with Eclipse 2.1 and the SWT:http://www.cs.umanitoba.ca/~eclipse/
SWT Javadocs:http://help.eclipse.org/ganymede/index.jsp -> Platform Plug-in Developer Guide - > Reference -> API Reference -> org.eclipse.swt.*
Understanding Layouts in SWT:http://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html
Eclipse文章:http://www.eclipse.org/articles/