自訂小組件

有時,您可能發現 SWT 中沒有提供符合您應用程式需求的控制項。 在這些情況下,您可能要實作自己的自訂小組件來擴充 SWT。SWT 本身提供套件 org.eclipse.swt.custom ,它包含不在 SWT 控制項的核心集之中,但需要實作平台工作台的自訂控制項。

控制項
目的
樣式
事件

CCombo

類似 Combo,但自訂 drawn 來允許使用不含邊框的組合。這個類別開發來使用表格資 料格內的組合。

BORDER、FLAT、READ_ONLY

Dispose、Control*、Selection

CLabel

類似 Label,但支援含有省略符號的文字剪輯。也支援如同在作用中工作台視圖 看到的背景顏色漸層效果。不支援包裝。

CENTER、LEFT、RIGHT、SHADOW_IN、SHADOW_OUT、SHADOW_NONE

Dispose、Control*

CTabFolder

類似 TabFolder,但支援標示(頂端或底端)和邊框的視覺化外觀附加配置。

BORDER, FLAT, BOTTOM, TOP

Dispose、Control*、Selection

CTabItem

對應於 CTabFolder 中頁面的標籤之可選取使用者介面物件。

 
Dispose、Control*

SashForm

複合式控制項,在列或直欄安排中佈置其子項並使用 Sash 來分隔它們,以便使用者 可調整它們的大小。

BORDER、HORIZONTAL、VERTICAL

Dispose、Control*

ScrolledComposite

複合式控制項,捲動其容並選擇性地延伸其內容來填入可用空間。

BORDER、H_SCROLL、V_SCROLL

Dispose、Control*

StyledText

可讓使用者輸入文字的可編輯控制項。控制項內的文字範圍可以有不同的顏色(前景和背景)和字型(粗體和一般字體)。

BORDER, FULL_SELECTION, MULTI, SINGLE, WRAP, READ_ONLY

Dispose, Control*, ExtendedModify, LineGetBackground, LineGetSegments, LineGetStyle, Modify, Selection, Verify, VerifyKey

TableTree

顯示可供使用者選取的項目階層式清單之可選取控制項。項目在許多列中顯示,這些列顯示多個代表不同形式項目的直欄。

BORDER、SINGLE、MULTI、CHECK、FULL_SELECTION

Dispose、Control*、Selection、DefaultSelection、Collapse、 Expand

TableTreeItem

代表 TableTree 中樹狀結構項目階層的可選取使用者介面物件。

 
 

ViewForm

複合式控制項,以水平方向佈置三個子項並允許程式化控制 layout 和 border 參數。 在工作台中用來實作視圖的標籤/工具列/功能表本端列。

BORDER, FLAT

Dispose、Control*

Control* = 繼承自控制項的事件:  FocusIn、FocusOut、Help、KeyDown、KeyUp、MouseDoubleClick、MouseDown、MouseEnter、MouseExit、MouseHover、MouseUp、MouseMove、Move、PaintResize

實作自訂小組件之前,您應該考量許多重要問題:

一旦您確定需要自訂小組件且決定好必須支援的平台後,您可以考量小組件的一些實 作技術。這些技術可根據基礎 OS 平台中的可用項目來混合及配合使用。

原生的實作

如果您的應用程式需要不是由 SWT 提供的原生小組件,您必須未加修飾地實作它。 這可能是平台小組件、第三人小組件或平台共用程式庫中其他任何小組件。

每一個 SWT 平台皆提供一個共用程式庫(例如 Windows 上的 DLL)和一個 JAR(適 用 Java 類別檔)。共用程式庫包含 SWT 需要的所有原生函數,但不表示為平台上 一組完整的可用函數。如果要顯示不是由 SWT 顯示的原生函數或原生小組件,您需要 撰寫自己的共用程式庫。如果您使用一個平台上的原生程式碼和另一平台上的可移植程式碼之組合,請確定您已在具有原生小組件的平台呼叫共用程式庫,以及在具有可移植小組件的平台呼叫 jar。

如果要實作原生小組件,您必須瞭解「Java 原生介面」(JNI)、共用程式庫中小組件的 API,以及 C 中的基礎 OS 平台 API。

實作的基礎程序是決定將在 Java API 中顯示原生小組件哪一部分的 API,以及 撰寫呼叫原生小組件的 Java 程式碼來實作行為。 必須撰寫 JNI C 程式碼才能呼叫共用程式庫。

當建置您自己的原生小組件實作時,遵循用來實作 SWT 的設計原則是不錯的建 議。 例如,您的 JNI 原生應透過在共用程式庫所做的 API 呼叫來一對一對映。

您可以在 Creating Your Own Widgets using SWT 中找到原生自訂小組件實作的完整範例。

擴充現存的小組件

如果您新小組件的概念或實作類似現存的小組件,您可能要包裝現存的 SWT 小組件。這項技術用於 TableTree 的實作。

如果要包裝小組件,您需要建立 CompositeCanvas 小組件(視您的控制項有無子項而定)的子類別。 在自訂小組件的建構子中,建立已包裝的小組件。在為您的實作呼叫已包裝小組件的 API 後,結果小組件將是 100% 的可移植 Java。

包裝小組件是實作自訂小組件的一種方式,通常比從頭開始要簡單。 不過,在為新小組件設計 API 時必須小心。這裡是一些重點要訣:

考量您的小組件是「一種」已包裝的小組件或僅用於其實作的小組件。 例如,表格樹狀結構不是一種表格。它不參考由列號檢索的項目。 TableTree 僅使用表格來實作呈現方式和新增樹狀結構行為。 如果您純粹是基於實作理由來包裝小組件,則您的 API 看起來可能不像基礎小組件的 API。

儘量不要轉送太多方法和事件。請勿重新實作已包裝小組件的整個 API,否則當未來 版本中已包裝 API 發生變更時,您就要不斷地執行擷取操作。 應轉遞大部分小組件共用的方法,例如 setFontsetForegroundsetBackground

如果您發現自己在實作大部分已包裝小組件的 API,請考量在 API 層次顯示已包裝小組件並讓應用程式碼直接使用該已包裝小組件。在這個情況下,您可能要重新考量 是否提供完全合理的新小組件。將您的特性實作為「配接器」可能較適合 ,它可新增行為給小組件但不假裝為小組件。(JFace 檢視器遵循這個型樣。)

附註:這個討論僅著重於包裝小組件來擴充小組件的行為。 建議您最好藉由次分類來擴充小組件,因為這可讓您的小組件與 Super 類別實作相關。

自訂繪製實作

在某些情況下,您沒有任何在新組件實作中協助您的現存小組件或原生程式碼。 這表示您必須使用 SWT 圖形呼叫來自行繪製小組件。雖然這個技術可能相當複雜, 但優點是可以產生一個可完全移植的實作。

藉由使用下列這些規則,建立 CanvasComposite 類別的子類別來實作自訂繪製控制項:

在自訂繪製控制項中,您的內部狀態保存於 Java 實例變數中。 根據您的小組件需求來定義 API 和樣式。

自訂繪製小組件的內部實作通常包括下列這些主要作業:

org.eclipse.swt.custom 中實作的許多小組件都是使用這種方式。您可以在 CLabel 中找到簡單範例。

有關自訂小組件的進一步資訊,請參閱使用 SWT 建立您自己的小組件。

法律注意事項