佈置

我們已經看過一些簡單範例,顯示如何依據母項大小來定位或調整子項小組件大小。 到目前為止,已發生這種計算來回應調整大小接聽器。通常這是處理簡單小組件定位 的最佳方式。不過,應用程式在放置小組件時使用一些共用型樣。這些型樣可建構為 可配置的佈置演算法,供許多不同的應用程式重複使用。

SWT 定義 layouts,它提供在組合中定位及調整子項小組件大小的一般用途 。 Layouts 為抽象類別 Layout 的子類別。您可以在 org.eclipse.swt.layout 套件中找到 SWT 標準佈置。

小組件佈置概念

當定位及重新調整小組件大小時,您應該瞭解某些一般定義。

無論是否使用佈置,這些概念都與應用程式有關。您可以將佈置視為封裝調整大小功 能來重複使用的好方法。

其他概念由佈置引進。

有關示範這些概念的圖片和進一步討論,請參閱瞭解 SWT 中的佈置

下列程式碼片段顯示使用調整大小回復將標籤大小調整成其母項 Shell 大小的應用 程式簡單案例。

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.addControlListener(new ControlAdapter() {
    public void controlResized(ControlEvent e) {
        label.setBounds (shell.getClientArea ());
    }
});

下一個片段使用佈置來達到相同的效果:

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.setLayout(new FillLayout());

這個簡單範例就是使用佈置來減少應用程式碼。佈置越複雜,簡化效果就越大。

SWT 提供三個適用許多狀況的預設佈置類別。

Fill Layout

FillLayout 是最簡單的佈置類別。它在單一列或直欄中佈置小組件,迫使 它們的大小相同。一開始,小組件全都與最高小組件一樣高,且與最寬小組件一樣寬 。 FillLayout 不會包裝,所以您無法指定邊距或間隔。

您可以使用 FillLayout 來佈置工作列或工具列中的按鈕,或堆疊 Group 中的勾選框。   FillLayout 也可在 Composite 只有一個子項時使用。在上面的範例中,FillLayout 使標籤完全佈滿它的母項 Shell。

RowLayout

RowLayout 也可在列中佈置小組件,但比 FillLayout 更有彈性。它可使小組件包裝,建立與顯示所需一樣多的列數。 它也提供可在佈置的每一邊配置邊距,以及可在佈置中小組件之間配置間隔。 您可以壓縮 RowLayout ,強制所有小組件的大小相同。如果您對齊了 RowLayout ,則 Composite 中剩餘的額外空間會配置為小組件之間的邊距。

RowLayout 中每一個小組件的高度和寬度可在 RowData 物件中指定,該物件應使用 setLayoutData 在小組件中設定。

格線佈置

GridLayout 是功能最強(也最複雜)的佈置。 GridLayout 在格線中佈置小組件,提供了許多可配置參數,來控制調整組 合大小時格線列和欄的操作方式。

GridLayout 定義控制整體佈置策略的 API。最重要的屬性為 numColumns,它可決定格線 的水平大小。通常您在第一次設定視窗外觀時決定此值。格線中小組件的順序與您建 立它們的順序相同。若要變更格線中小組件的順序,您可以使用 Control 方法 moveAbove(Control)moveBelow(Control)。這些方法可讓 小組件在佈置中插入彼此的前的後。("above" 和 "below" 指 示小組件 Z 順序,不是格線本身的位置。)

下表彙總 GridLayout 的可配置參數。

屬性

說明

horizontalSpacing

一個資料格右邊緣及其鄰接資料格左邊緣之間的圖素數目。

makeColumnsEqualWidth

指定所有直欄是否強制為相同寬度。

marginWidth

用於格線右邊緣和左邊緣上邊距的圖素數目。

marginHeight

用於格線上邊緣和下邊緣上邊距的圖素數目。

numColumns

用來製作格線的直欄數。

verticalSpacing

一個資料格下邊緣及其鄰接資料格上邊緣之間的圖素數目。

GridLayout 支援格線中每一個小組件其他許多佈置參數。 這些內容指定於 GridData 物件中。您必須在格線中對每一個小組件將 GridData 設為 layoutData

GridData 類別定義讓您在 GridData 建構子中指定常用佈置參數組合的樣式常數。您也可以在 GridData 中使用 public 方法來個別設定這些屬性。

您可以使用 GridData 來達到一些非常機動且複雜的佈置。對格線中不同的小組件轉換這些值,會產生不同的 佈置組合。甚至是最複雜的對話框佈置也可使用 GridData 來指定。讓小組件跨越資料格的功能會產生許多甚至不像格線的佈置。

下表彙總 GridData 的可配置參數。有關使用各種格線參數擷取範例畫面及進一步說明,請參閱瞭解 SWT 中的佈置

屬性

說明

grabExcessHorizontalSpace

指定是否加大資料格來使用格線中任何可用的額外水平空間。依據小組件及其格線資 料計算格線中的資料格大小後,「組合」中剩餘的任何額外空間會配置給佔據過多空 間的那些資料格。

grabExcessVerticalSpace

指定是否加大資料格來使用格線中任何可用的額外垂直空間。

heightHint

指定小組件的最小高度(使適合包含它的列)。

horizontalAlignment

可以是 BEGINNINGCENTERENDFILL 其中之一。 FILL 表示將調整小組件大小使佔滿其格線資料格的整個寬度。

horizontalIndent

小組件及其格線資料格左邊緣之間的圖素數目。

horizontalSpan

指定格線中小組件將跨過的直欄數。依預設,小組件會佔滿格線中一個資料格。 可藉由增加此值依水平方向佔滿其他資料格。

verticalAlignment

可以是 BEGINNINGCENTERENDFILL 其中之一。 FILL 表示將調整小組件大小使佔滿其格線資料格的整個高度。

verticalSpan

指定格線中小組件將跨過的列數。依預設,小組件會佔滿格線中一個資料格。 可藉由 增加此值依垂直方向佔滿其他資料格。

widthHint

指定小組件的最小寬度(使適合包含它的直欄)。

自訂佈置

有時,您可能需要撰寫自己的自訂 Layout 類別。這最適合您在應用程式的許多不同位置中有使用複雜佈置時。當您使用應用程式 特定知識最佳化佈置時,可能也適合。建置自訂佈置之前,注意事項如下:

除非您撰寫供許多 Composite 小組件使用的極普通佈置,否則在調整大小接聽器中計算大小和位置子項通常更簡 單容易。許多 SWT 自訂小組件都是用這個方法撰寫的。雖然新小組件可實作為 Composite/Layout 配對,但將它實作為 Composite 還是比較容易懂,因為是在調整大小接聽器中製作它的佈置,以及在 computeSize 中計算它的偏好大小,而且不需要撰寫額外類別。

如果您還是覺得需要自訂佈置類別,建議您不妨先在調整大小接聽器中實作佈置演算 法。 這可以使演算法本身的除錯更簡單。請務必測試佈置的各種情況:調小一點、調大一點 、包裝和剪輯。一旦演算法在使用中,便可重算程式碼成為 Layout 的子類別。 

佈置負責實作兩個方法:

您可以在瞭解 SWT 中的佈置中找到自訂佈置的進一步說明。