小組件

SWT 併入許多完整功能,但系統基核(小組件佈置事件 )的基本知識是實作有用及健全應用程式絕對必要的。

小組件應用程式結構

當您使用平台工作台延伸項目提供 UI 元素時,工作台會為您處理啟動 SWT 的機制。

如果您是從頭開始撰寫 SWT 應用程式(工作台除外),則必須詳細瞭解 SWT 的 應用程式結構。

典型獨立式 SWT 應用程式具有下列結構:

下列程式碼片段改編自 org.eclipse.swt.examples.helloworld.HelloWorld2 應用程式。因為該應 用程式僅顯示字串 "Hello World",所以不需要對任何小組件事件登錄。

public static void main (String [] args) {
    Display display = new Display ();
    Shell shell = new Shell (display);
    Label label = new Label (shell, SWT.CENTER);
    label.setText ("Hello_world");
    label.setBounds (shell.getClientArea ());
    shell.open ();
    while (!shell.isDisposed ()) {
        if (!display.readAndDispatch ()) display.sleep ();
    }
    display.dispose ();
}

Display

Display 代表 SWT 與基礎平台的 GUI 系統之間的連線。Display 主要用來管理平台事件迴圈 及控制 UI 執行緒和其他執行緒之間的通信。(有關 UI 執行緒作業問題的完整討論 ,請參閱從屬站的執行緒作業問題。)

以大部份應用程式而言,您可以遵循上面使用的型樣。您必須在建立任何視窗前先建 立一個顯示畫面,而且您必須在 Shell 關閉後除去該顯示畫面。除非您是設計多重 執行緒的應用程式,否則不需要對顯示畫面考慮太多。

Shell

Shell 是由 OS 平台視窗管理程式管理的一個 「視窗」。 最上層 Shell 就是建立為顯示畫面子項的那些視窗。這些視窗就是使用者使用應用 程式時移動、調整大小、最小化和最大化的那些視窗。第二層 Shell 就是建立為另 一個 Shell 子項的那些視窗。這些視窗通常作為對話視窗或其他僅存於另一視窗上 下文中的暫時性視窗。

母項和子項

非最上層 Shell 的所有小組件都有母項。最上層 Shell 沒有母項,但全都與特定 Display 有關。您可以使用 getDisplay() 來存取這個顯示畫面。其他 所有小組件建立為最上層 Shell 的後代(直接或間接)。

Composite 小組件是可具有子項的小組件。

當您看到應用程式視窗時,您可以將它視為小組件樹狀結構或是根為 Shell 的階層 。 根據應用程式的複雜性,可能有 Shell 的單一子項、許多子項或具有子項的組合之 巢狀層次。

小組件生命週期

當您的應用程式建立小組件時,SWT 會立即建立基礎的平台小組件。此依據基礎的 OS 小組件是否存在來減少以不同方式操作的程式碼需求。它也可讓多數小組件資料 保存在平台層次中,而非在工具箱中複製。這表示工具箱的小組件生命週期概念必須 符合基礎的 GUI 系統規則。

小組件建立

大部份 GUI 平台建立小組件時需要您指定母項。因為只要您建立工具箱小組件,SWT 就會建立平台小組件,母項小組件必須在小組件的建構子中指定。

樣式位元

某些小組件內容必須由 OS 在建立小組件時設定,以後無法變更。 例如,清單可能是單一或多重選項,不一定會有捲軸。

這些內容(稱為樣式)必須在建構子中設定。所有小組件建構子都有 int 引數,它指定所有想要樣式的按位元 OR。在某些情況下,特定 樣式被視為一種提示,這表示它可能不適用所有平台,而會在不支援它的平台上被順 利忽略。

樣式常數位於 SWT 類別中作為公 開靜態欄位。每一個小組件類別適用的常數清單包含在 SWT 的 API 參照中。

除去資源

SWT 下面的 OS 平台需要明確配置及釋出 OS 資源。為保存在小組件工具箱反映平台 應用程式結構的 SWT 設計理念,SWT 需要您明確地釋出所配置的任何 OS 資源。 在 SWT 中,dispose() 方法用來釋出與特定工具箱物件相關的資源。

簡略的規則為如果您建立物件,就必須將它除去。以下是進一步解說此理念的一些特 定基本規則:

這些規則有一個異常狀況。簡單資料物件,例如 RectanglePoint ,不使用作業系統資源。它們沒有 dispose() 方法,所以您不需要釋出它們 。如果不確定,請參考 javadoc 中的特定類別。