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");
運行結果如下所示:
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
RowLayout:RowLayout佈局管理器將組件按行排列。可以定義RowLayout的橫向或者縱向,以確定組件是橫排還是縱排。RowLayout還可以設置一些其他的屬性,例如wrap,pack,margin和spacing。
如果將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時,所有的組件將會保持相同的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/