學習筆記:Understanding Layouts in SWT(1)

來源:互聯網
上載者:User

20060628

學習筆記:Understanding Layouts in SWT

原文:Understanding Layouts in SWT

參考:Eclipse Help: Platform Plug-in Developer Guide->Programmer’s Guide->Standard Widget Tookit->Layouts.

或:http://help.eclipse.org/help30/topic/org.eclipse.platform.doc.isv/guide/swt_layouts.htm (3.0協助)

聯機3.2協助和網上的3.0的協助某些內容不一樣

 

雖然Layout這個東東經常用,但總記不住,每次都要翻開這篇文章或Eclipse Help查詢Layout的用法。

 

標準Layout:

· FillLayout – lays out equal-sized widgets in a single row or column

· RowLayout – lays out widgets in a row or rows, with fill, wrap, and spacing options

· GridLayout – lays out widgets in a grid

· FormLayout–lays out widgets using an attachment model.

· StackLayout–creates a conceptual stack of widgets

· Custom Layouts–使用者自訂Layout

 

原文中只提到了前三種Layout,但通過尋找3.2的相關文檔和代碼,其實共有6種Layout。

 

 

FillLayout

最簡單的一種Layout。

Parent composite上的widgets會充滿所有的空間。拉大parent composite,widget也會同時變大,它們大小相等。分為水平Fill和豎直Fill,由FillLayout.type決定。

嘗試了一下,無論type是SWT.VERTICAL,還是SWT.HORIZONTAL,parent composite所能拉到的最小高度都是0。所能拉到的最小寬度不一樣。

當SWT.HORIZONTAL時,parent composite拉到最小寬度時,只有自然寬度最小的那個widget的內容是可見的,懷疑此時最小寬度是由自然寬度最小的組件決定的。

當SWT.VERTICAL時,parent composite拉到最小寬度時,每個widget的內容是可見的,我想此時最小寬度應該是由自然寬度最大的組件決定的。

 

 

RowLayout

當對某個組件設定RowLayout時,這個組件的children widget就會以設定的layout布置位置。

 

Wrap:

true: 如果當前行的空間不夠(也就是說某個child widget顯示不下),那麼它包含的child widget就會到 下一行顯示。

false: 當然,即使顯示不下,也會放在這一行,這意味著這個widget有部分是不可見的。

 

預設的是true。

嘗試著執行原文中的RowLayout Examples的代碼,本來想試試看wrap置為true,如果我把這個shell的寬度拉到即使它到第二行也顯示不下,會怎麼樣。呵呵,結果發現竟然shell的大小不能拉到那麼小。shell能拉到的最小寬度比它的所有children widgets的最大的寬度稍大。shell的高度似乎沒限制,想怎麼拉就怎麼啦。

 

Pack:

true: 組件的大小是它的自然大小。比如說某個composite的RowLayout.Pack = true,在這個composite上有個button。Button顯示的內容為“Button 1”,那麼這個Button的大小就會剛好容納下“Button 1”這個字串。也就是說,這個button的寬度會根據它顯示的內容來定。所以當button顯示內容不同時,button的寬度就不一樣。

false:: 組件會充滿可用的空間。和FillLayout有點相似。

預設是true.

 

Justify

true: 組件會從左至右盡量伸展它的佔用的空間(它佔用的寬度,而不是組件它本身的寬度)。當parent composite變寬,那麼多出來的空間就會被每個組件搶跑,儘管組件不一定需要那麼大的空間。

false::就不會出現上面的情況了。

預設是false.

文中說,如果pack和justify都是true,那麼每個組件都是它的自然大小,但是每個組件之間會有多餘空間,差不多可以說是站著茅坑不拉屎。

 

MarginLeft, MarginTop, MarginRight, MarginBottom and Spacing

簡單的翻譯一下原文:這幾個值控制著widget與widget之間的空間(spacing),控制著widget和parent composite的邊界只見的空間(margin)。它們的單位是像素(pixel)。預設的情況下,margin和spacing的值都是3 。

文章雖然是這麼說,但是我查了一下3.0的代碼,發現margin的預設值是0,spacing才是3。估計原作者的SWT版本比較老。

 

RowData

RowData就是用來控制widget的大小的,在3.1之前,它有2個field:width和height,這兩個屬性不言而喻。自從3.1開始,多了個exclude,help文檔對它的解釋是:exclude informs the layout to ignore this control when sizing and positioning controls.我有些不大明白。它預設值false,相當於3.1之前沒有這個變數一樣。當值為true的時候,這個widget就不見了,我有點百思不得其解。不明白呢。

關於exclude 這個變數,從eclipse.org上可以找到這個網頁:http://www.eclipse.org/swt/R3_1/new_and_noteworthy.html,繼而找到了代碼:http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet175.java?rev=HEAD&content-type=text/vnd.viewcvs-markup。呵呵,嘗試完代碼Snippet175,終於明白了。

當這個widget(設為A)的RowData.exclude = true的時候,parent composite 在對它的children widget進行layout的時候,會當A不存在。也就是時說,在建立了widget A之後,A之後建立的組件的位置會是A組件的位置,這樣就會把A覆蓋掉。如果設為false,就和我們現在的一樣了。

但是有個問題,如果A的exclude 原來是false,我現在要改為true,這樣就要重新對parent composite進行layout(當作A不存在進行layout),但很奇怪的是這次是A覆蓋了它後面的widget,而不是後面的widget覆蓋它。是不是因為A修改了RowData的緣故,在parent composite的其它widgets進行layout之後,再才對A進行layout ?這個有待進一步核實。

 

這兩天手頭bug幾乎沒有,比較空閑,明天再繼續學習。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.