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/

發佈了16 篇原創文章 · 獲贊 0 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章