Posted on 2006-03-09 13:51
fortune 閱讀(1818)
評論(0) 編輯 收藏 所屬分類:
我的學習筆記
MarginWidth, MarginHeight
離頁邊寬度和高度,與GridLayout中相似
Display display = new Display ();
Shell shell = new Shell (display);
FormLayout layout= new FormLayout ();
layout.marginHeight = 5;
layout.marginWidth = 5;
shell.setLayout (layout);
FormData
指定了每個widget在FormLayout中怎樣排列
很典型地,一個FormData實例在一個合成器內被幫定于各個子control。因為對于一個表格布局其核心思想就是指明各個子control的相對位置,所以不同于其他的布局,給予各個子control提供設置用data非常重要。如果一個給定的control沒有一個FormData實例來描述它,則它會被默認為放置于合成器的左上角,而這種位置是你極少期望的。寬度和高度屬性用象素來指明一個control的方位。頂部、底部和左右屬性較為重要,且都持有一個FormAttachment實例。這些attachment描繪了在一個合成器內control間的關系。
注意:如果多個widgets未指明任何attachment,他們都會在缺省值指定的位置重疊起來
使用FormAttachment指明關系
理解FormAttachment是使用表格布局的一個非常重要的方面。就像早先提起的,每一個FormAttachment實例描述了一個control某一面的位置。你可以以兩種不同的方式使用FormAttachment。
首先,你可以使用父合成器的百分比來指明一個FormAttachment。例如,如果一個左側的FormData被設定為50%,則control的右邊際會處于合成器的水平中央。同樣地,如果設定頂端邊界為75%則control會處于合成器自上而下的四分之三處。表6.3總結了用以指定百分比的FormAttachment構造器。以百分比的形式來指明FormAttachment是有用的,但你不能總是應用這種方法。將你的所有control通用百分比方式作說明和用絕對的象素點來指明他們沒有太大的區別:因為當合成器被重定大小時,如何快速定位每一個元素會變得相當困難,因為control并不會如你所愿地在該位置上。使用表格式布局的關鍵點是在于確定control間的相互位置,而這正是FormAttachement所允許的。
基于百分比FormAttachment構造器
構造器 |
描述 |
FormAttachment(int numerator) |
假定分母為100,意味著參數即被視為一個百分比。
僅在SWT 3.0中可用。 |
FormAttachment(int numerator, int offset) |
假定分母為100,意味著參數即被視為一個百分比。
偏移量offset是在百分比定位的基礎上再行偏移的象素數目。 |
FormAttachment(int numerator, int denominator, int offset) |
假定分母為denominator,意味著參數即被視為一個百分比。
偏移量offset是在百分比定位的基礎上再行偏移的象素數目。 |
FormAttachment第二系列的構造器是基于對其他control的參照。它們常常將一個control的邊緣與相鄰的control相對定位。通過為button1設定FormData右屬性到一個基于button2而構建的FormAttachment,你可以說button1應該總是定位與button2的右側。將你的絕大多數control依照這種方式去定位有多種好處。你的布局代碼目的就變得很容易理解:在過去的象素或是百分壁基礎上的那個control與哪個control相鄰的表達方式被取代后,就變得很明顯了,例如:名為foo的control應該位于工具條之下;其次,表格式布局也容易維持你的這種布局意圖。無論合成器的尺寸如何大小變化,它總是能夠維持其正確的相對位置。
FormData formData = new FormData();
formData.top = new FormAttachment(30,70,10);
button1.setLayoutData(formData);
指的是加入該Composite含有70個單元則該button1的頂部位于Composite從上數30個單元再加10個像素的位移
作為指定相對位置之用的FormAttachment構造器有若干種形式,具體總結如下
:
構造器 |
描述 |
FormAttachment(Control control) |
將現有小部件添于鄰接的control一側的參數。 |
FormAttachment(Control control, int offset) |
將現有小部件添于鄰接的control一側的參數,并且有offset數量象素的偏移量。 |
FormAttachment(Control control, int offset, int alignment) |
排列alignment必須為 SWT.TOP、 SWT.BOTTOM、SWT.LEFT、 SWT.RIGHT或SWT.CENTER其中之一。
將現有小部件添于鄰接的control一側的參數,并且有offset數量象素的偏移量。 |
注意:對于top和left的offset應該為正數,對于bottom和right的offset應該為負數
相對于另一個 widget進行定位
FormData formData = new FormData();
formData.top = new FormAttachment(20,0);
button1.setLayoutData(formData);
FormData formData2 = new FormData();
formData2.top = new FormAttachment(button1,10);
button2.setLayoutData(formData2);
上面這段代碼的意思就是首先將button1頂部放置在距離Composite頂部20%處,然后將button2的頂部放置在button1下10個像素位移處,當窗口大小改變時,button1會一直隨著改變并處于20%處,而button2也一直在button1下方10個像素處
formData2.top = new FormAttachment(button1,0,SWT.TOP); 指定button2的頂部和button1相同也處于20%處
FormData formData = new FormData(50,50);
formData.top = new FormAttachment(20,0);
button1.setLayoutData(formData);
FormData formData2 = new FormData();
FormData2.left = new FormAttachment(button1,5);
formData2.top = new FormAttachment(button1,0,SWT.TOP);
button2.setLayoutData(formData2);
上面的代碼說明button1大小為50*50像素,距離頂部20%,button2的左邊與button1距離差5個像素,頂部與button1相同
若將上面改為formData.top = new FormAttachment(button1,0,SWT.CENTER);則button2在button1左邊5個像素處且在垂直方向上處于button1的中間
注意:千萬不要定義重復的attachment,如定義button2的左邊連著button1的右邊,又定義button1的右邊連著button2的左邊,這樣會導致未定義錯誤,所以一定要確定你的weidget沒有重復限制他們的位置,僅定義 需要限制位置的widget
參考:http://www.eclipse.org/articles/Understanding%20Layouts/Understanding%20Layouts.htm