SWT布局管理器

SWT布局管理器(Standard Wdiget Toolkit)

为了设置组件的大小和位置,可以通过编程的方式来完成,但是当窗口大小发生变化时,需要添加监听器进行控制,另外一种方式就是使用布局管理器来管理组件的布局。SWT提供了四种布局管理器,分别为FillLayoutRowLayoutGridLayoutFormLayout。布局管理器是Plugable的,为组件设置布局管理器通过setLayout(Layout)方法完成,可以通过实现Layout,来添加自定义的布局管理器。

FillLayoutFillLayout是最基本的布局管理器。当将组件添加到屏幕时,FillLayout安排他们的水平成行,垂直成列。它将组件平均的放置,以使组件填满CompositeFillLayout不包含布局数据,所以只需要为其定义是水平摆放还是垂直摆放组件。

当希望均匀的摆放组件,例如标签列表,按钮列表时,可以使用这个布局管理器。

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");

运行结果如下所示:

https://p-blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/FillLayout1.png--->改变窗口大小https://p-blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/FillLayout2.png

 

RowLayoutRowLayout布局管理器将组件按行排列。可以定义RowLayout的横向或者纵向,以确定组件是横排还是纵排。RowLayout还可以设置一些其他的属性,例如wrappackmarginspacing

如果将pack属性设置为true,那么所有的组件保持原来的自然大小,并且尽可能的被放在最左边或者最上边。这是和FillLayout的主要区别。例如上面的例子如果使用RowLayout,那么初始状态和FillLayout相似,但是当改变屏幕大小时,所有的组件靠近最上边,而不是均匀分布。

https://p-blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/RowLayout1.png
RowLayout
的另一个特点是wrap属性,当wrap属性设置为true的时候,如果一行对于窗口来说太长的时候,布局管理器会将调整成两行,例如在上面的例子中,如果将窗口变得很小,它们就会重叠。

https://p-blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/FillLayout3.png
而如果使用
RowLayout的话,它们会自动的编成两列以适应窗口:

https://p-blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090408/RowLayout2.png
当将
pack设置为false时,所有的组件将会保持相同的sizewraptrue时,由窗口决定是否排列为一行还是多行。

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还可以设置justifyspacing,以及四个方向的margin属性。

 

GridLayoutGridLayout布局管理器提供了比RowLayoutFillLayout更多的灵活性,但是这种灵活性是需要付出代价的。GridLayout需要计算GridData和很多field的值,因为只有这样做才可以获取GridLayout布局管理器的优点。

最重要的属性要数numColumnmakeColumnsEqualWidth了,可以通过它们确定组件的列数,以及它们是否要保持相同的大小还是保持自身的大小。应该总是使列的数量和在一行中可以放置的最多的个数相同,例如有的行放置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(左对齐),CENTERENDFILL。以及是否获取生育的空间grabExcessHorizontalSpacegrabExcessVerticalSpace

 

FormLayoutFormLayout是最新的布局管理器,并且关于它是否比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 SWThttp://www.cs.umanitoba.ca/~eclipse/

SWT Javadocshttp://help.eclipse.org/ganymede/index.jsp -> Platform Plug-in Developer Guide - > Reference -> API Reference -> org.eclipse.swt.*

Understanding Layouts in SWThttp://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html

Eclipse文章:http://www.eclipse.org/articles/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值