有時,您可能發現 SWT 中沒有提供符合您應用程式需求的控制項。 在這些情況下,您可能要實作自己的自訂 Widget 來擴充 SWT。SWT 本身提供套件 org.eclipse.swt.custom ,它包含不在 SWT 控制項的核心集之中,但需要實作平台工作台的自訂控制項。
控制項
|
目的
|
樣式
|
事件 |
---|---|---|---|
類似 Combo,但自訂 drawn 來允許使用不含邊框的組合。此類別開發來使用表格資 料格內的組合。 |
BORDER、FLAT、READ_ONLY |
Dispose、Control*、Selection | |
類似 Label,但支援含有省略符號的文字剪輯。也支援如同在作用中工作台檢視畫面 看到的背景顏色漸層效果。不支援包裝。 |
CENTER、LEFT、RIGHT、SHADOW_IN、SHADOW_OUT、SHADOW_NONE |
Dispose、Control* | |
類似 TabFolder,但支援標示(頂端或底端)和邊框的視覺化外觀附加配置。 |
BORDER, FLAT, BOTTOM, TOP |
Dispose、Control*、Selection | |
對應於 CTabFolder 中頁面的標籤之可選取使用者介面物件。 |
|
Dispose、Control* | |
複合式控制項,在列或直欄安排中佈置其子項並使用 Sash 來分隔它們,以便使用者 可調整它們的大小。 |
BORDER、HORIZONTAL、VERTICAL |
Dispose、Control* | |
複合式控制項,捲動其容並選擇性地延伸其內容來填入可用空間。 |
BORDER、H_SCROLL、V_SCROLL |
Dispose、Control* | |
可讓使用者鍵入文字的可編輯控制項。控制項內的文字範圍可以有不同的字型和顏色 (前景和背景)。 |
BORDER, FULL_SELECTION, MULTI, SINGLE, WRAP, READ_ONLY |
Dispose, Control*, ExtendedModify, LineGetBackground, LineGetSegments, LineGetStyle, Modify, Selection, Verify, VerifyKey | |
顯示可供使用者選取的項目階層式清單之可選取控制項。項目在許多列中顯示,這些列顯示多個代表不同形式項目的直欄。 |
BORDER、SINGLE、MULTI、CHECK、FULL_SELECTION |
Dispose、Control*、Selection、DefaultSelection、Collapse、 Expand | |
代表 TableTree 中樹狀結構項目階層的可選取使用者介面物件。 |
|
||
複合式控制項,以水平方向佈置三個子項並允許程式化控制 layout 和 border 參數。 在工作台中用來實作檢視畫面的標籤/工具列/功能表本端列。 |
BORDER, FLAT |
Dispose、Control* |
Control* = 繼承自控制項的事件: FocusIn、FocusOut、Help、KeyDown、KeyUp、MouseDoubleClick、MouseDown、MouseEnter、MouseExit、MouseHover、MouseUp、MouseMove、Move、PaintResize
實作自訂 Widget 之前,您應該考量許多重要問題:
一旦您確定需要自訂 Widget 且決定好必須支援的平台後,您可以考量 Widget 的一些實 作技術。這些技術可根據基礎 OS 平台中的可用項目來混合及配合使用。
如果您的應用程式需要不是由 SWT 提供的原生 Widget,您必須未加修飾地實作它。 這可能是平台 Widget、第三人 Widget 或平台共用程式庫中其他任何 Widget。
每一個 SWT 平台皆提供一個共用程式庫(例如 Windows 上的 DLL)和一個 JAR(適 用 Java 類別檔)。共用程式庫包含 SWT 需要的所有原生函數,但不表示為平台上 一組完整的可用函數。若要顯示不是由 SWT 顯示的原生函數或原生 Widget,您需要 撰寫自己的共用程式庫。如果您使用一個平台上的原生程式碼和另一平台上的可移植程式碼之組合,請確定您已在具有原生 Widget 的平台呼叫共用程式庫,以及在具有可移植 Widget 的平台呼叫 jar。
若要實作原生 Widget,您必須瞭解「Java 原生介面(JNI)」、共用程式庫中 Widget 的 API,以及 C 中的基礎 OS 平台 API。
實作方式的基礎程序是決定將在 Java API 中顯示原生 Widget 哪一部份的 API,以及 撰寫呼叫原生 Widget 的 Java 程式碼來實作行為。 必須撰寫 JNI C 程式碼才能呼叫共用程式庫。
當建置您自己的原生 Widget 實作方式時,遵循用來實作 SWT 的設計原則是不錯的建 議。 例如,您的 JNI 原生應透過在共用程式庫所做的 API 呼叫來一對一對映。
您可以在 Creating Your Own Widgets using SWT 中找到原生自訂 Widget 實作方式的完整範例。
如果您新 Widget 的概念或實作方式類似現存的 Widget,您可能要包裝現存的 SWT Widget。 此技術用於 TableTree 的實作方式。
若要包裝 Widget,您需要建立 Composite 或 Canvas Widget(視您的控制項有無子項而定)的子類別。在自訂 Widget 的建構子中,建立已 包裝的 Widget。在為您的實作方式呼叫已包裝 Widget 的 API 後,結果 Widget 將是 100% 的可移植 Java。
包裝 Widget 是實作自訂 Widget 的一種方式,通常比從頭開始要簡單。 不過,在為新 Widget 設計 API 時必須小心。這裡是一些重點要訣:
考量您的 Widget 是「一種」已包裝的 Widget 或僅用於其實作方式的 Widget。 例如,表格樹狀結構不是一種表格。它不參考由列號檢索的項目。 TableTree 僅使用表格來實作呈現方式和新增樹狀結構行為。 如果您純粹是基於實作理由來包裝 Widget,則您的 API 看起來可能不像基礎 Widget 的 API。
儘量不要轉送太多方法和事件。請勿重新實作已包裝 Widget 的整個 API,否則當未來 版本中已包裝 API 發生變更時,您就要不斷地執行擷取操作。 應轉遞大部份 Widget 共用的方法,例如 setFont、setForeground、 setBackground。
如果您發現自己在實作大部份已包裝 Widget 的 API,請考量在 API 層次顯示已包裝 Widget 並讓應用程式碼直接使用該已包裝 Widget。在這個情況下,您可能要重新考量 是否提供完全合理的新 Widget。將您的特性實作為「配接器」可能較適合 ,它可新增行為給 Widget 但不假裝為 Widget。(JFace 檢視器遵循此型樣。)
附註:這個討論僅著重於包裝 Widget 來擴充 Widget 的行為。 建議您最好藉由次分類來擴充 Widget,因為這可讓您的 Widget 與超類別實作方式相關。
在某些情況下,您沒有任何在新組件實作方式中協助您的現存 Widget 或原生程式碼。 這表示您必須使用 SWT 圖形呼叫來自行繪製 Widget。雖然這個技術可能相當複雜, 但優點是可以產生一個可完全移植的實作方式。
藉由使用下列這些規則,建立 Canvas 或 Composite 類別的子類別來實作自訂繪製控制項:
在自訂繪製控制項中,您的內部狀態保存於 Java 實例變數中。 根據您的 Widget 需求來定義 API 和樣式。
自訂繪製 Widget 的內部實作方式通常包括下列這些主要作業:
org.eclipse.swt.custom 中實作的許多 Widget 都是使用這種方式。您可以在 CLabel 中找到簡單範例。
有關自訂 Widget 的進一步資訊,請參閱使用 SWT 建立您自己的 Widget。