場合によっては、SWT で提供されるどのコントロールも、アプリケーションのニーズを満たさないことがあります。 このような場合、独自のカスタム・ウィジェットを実装することにより、SWT を拡張することができます。SWT 自体は、 パッケージ org.eclipse.swt.custom を 提供します。これには、SWT コントロールのコア・セットには含まれない、 プラットフォーム・ワークベンチを実装するために必要となるカスタム・コントロールが含まれます。
コントロール
|
目的
|
スタイル
|
イベント |
---|---|---|---|
コンボと似ていますが、ボーダーなしでコンボを使用できるようにドローされたカスタムです。このクラスは、 テーブル・セル内でコンボを使用するために開発されました。 |
BORDER, FLAT, READ_ONLY |
Dispose, Control*, Selection | |
ラベルに似ていますが、省略符号付きのテキストのクリッピングをサポートします。 アクティブなワークベンチ・ビューで見られるような背景色のこう配効果もサポートします。ラッピングはサポートしません。 |
CENTER, LEFT, RIGHT, SHADOW_IN, SHADOW_OUT, SHADOW_NONE |
Dispose, Control* | |
タブ・フォルダーと似ていますが、タブ (上部または下部) および枠の視覚的な外観の追加構成をサポートします。 |
BORDER, FLAT, BOTTOM, TOP |
Dispose, Control*, Selection | |
CTabFolder でページのタブに対応する選択可能なユーザー・インターフェース・オブジェクト。 |
|
Dispose, Control* | |
行または列の配置に子をレイアウトし、ユーザーが子のサイズを変更できるように、 サッシを使用してそれらを分離させるコンポジット・コントロール。 |
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 内のツリー項目の階層を表す選択可能なユーザー・インターフェース・オブジェクト。 |
|
||
3 つの子を水平方向にレイアウトし、 レイアウトおよびボーダー・パラメーターの方針に基づいたコントロールを許可するコンポジット・コントロール。 ワークベンチで、ビューのラベル/ツールバー/メニューのローカル・バーを実装するために使用します。 |
BORDER, FLAT |
Dispose, Control* |
Control* = コントロールから継承されるイベント: FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize
カスタム・ウィジェットを実装する前に、以下のようないくつかの重要な点について考慮してください。
カスタム・ウィジェットが必要であると判断し、どのプラットフォームをサポートするかを決定した後、 ウィジェットのいくつかの実装技法について考慮します。 基礎となる OS プラットフォームで何が利用可能かに応じて、これらの技法を組み合わせることができます。
SWT により提供されない固有のウィジェットがアプリケーションで必要になる場合は、 それを固有に実装する必要があります。これは、 プラットフォーム共用ライブラリー内のプラットフォーム・ウィジェット、サード・パーティー・ウィジェット、 またはその他のウィジェットである場合があります。
各 SWT プラットフォームは、 共用ライブラリー (Windows の DLL など) および JAR (Java クラス・ファイル用) の両方と共に出荷されます。 共用ライブラリーには、SWT に必要なすべての固有な機能が含まれていますが、 これは、プラットフォーム上で使用できる機能の完全セットではありませんでした。 SWT によって公開されなかった固有機能または固有ウィジェットを公開するには、 独自の共有ライブラリーを作成する必要があります。 あるプラットフォーム上では固有なコードの組み合わせを、 別のプラットフォーム上では移植可能なコードを使用している場合は、 固有ウィジェットを持つプラットフォーム上の共用ライブラリー、 および移植可能ウィジェットを持つプラットフォーム上の JAR を呼び出すようにしてください。
固有ウィジェットを実装するには、Java Native Interface (JNI)、 共用ライブラリー内のウィジェットの API、および C の基礎 OS プラットフォーム API を理解する必要があります。
実装の基本プロセスは、固有ウィジェットのどの部分の API を Java API で公開するかを決定し、 振る舞いを実装する固有ウィジェットを呼び出す Java コードを書くことです。JNI C コードは、 共用ライブラリーを呼び出すように書く必要があります。
独自の固有ウィジェット・実装を作成する場合、 SWT の実装に使用される設計原則に従うとよいでしょう。例えば、JNI 固有のものは、 共用ライブラリーへ呼び出される API 呼び出しを使用してマップを行う必要があります。
固有のカスタム・ウィジェットの実装の完全な例については、 『 SWT を使用したユーザー独自のウィジェットの作成..』を参照してください。
新規ウィジェットが概念や実装の点で既存ウィジェットと類似している場合、 既存の SWT ウィジェットをラップすることができます。 この技法は、 TableTree の実装用に 使用されます。
ウィジェットをラップするには、 Composite または Canvas の 各ウィジェットのサブクラスを作成します (コントロールが子を持つ予定があるかどうかによる)。 カスタム・ウィジェットのコンストラクターには、ラップ済みウィジェットを作成します。 実装用にラップ済みウィジェットの API を呼び出しているため、 結果として作成されるウィジェットは、100% の Java 移植可能になります。
ウィジェットをラップすることにより、最初から始めるよりも、カスタム・ウィジェットを容易に実装することができます。 ただし、新規ウィジェットの API の設計には注意しなければなりません。以下に重要なヒントを示します。
ウィジェットが、"一種の"ラップ済みウィジェットであるのか、 または実装のためだけにラップ済みウィジェットを使用しているのかを考慮します。 例えば、テーブル・ツリーはテーブルの一種ではありません。ツリーは、行番号索引で項目を参照しません。 TableTree は、 表示を実装するためにテーブルを使用し、ツリー振る舞いを追加します。 実装のためだけにウィジェットをラップしている場合、 ユーザーの API は、基礎となるウィジェットの API に類似しないことがあります。
メソッドおよびイベントは、できる限り転送しないでください。ラップ済みウィジェットの API 全体を 再実装しないようにしてください。 それをした場合、ラップ済み API が今後のリリースで変更された場合に、 定期的にキャッチアップしなければなりません。ほとんどのウィジェットに共通の setFont、setForeground、および setBackground などのメソッドは、転送されなければなりません。
ほとんどのラップ済みウィジェット API を実装している場合は、 API レベルでラップ済みウィジェットを公開すること、 およびアプリケーション・コードで直接ラップ済みウィジェットを使用できるようにすることを考慮してください。 この場合、新規ウィジェットを提供することに意味があるかどうか再検討が必要になることがあります。 ウィジェットに振る舞いを追加するが、ウィジェットであるふりをしない "アダプター" として、 機能を実装するとよいことがあります。(JFace ビューアーは、このパターンに従います。)
注: ここでは、ウィジェットをラップすることによって、 ウィジェットの振る舞いを拡張することに限定して説明しています。 サブクラス化することによってウィジェットを拡張することは、 ウィジェットがスーパークラスの実装に依存するようになるため、お勧めできません。
場合によっては、新規ウィジェットの実装に役立つ、固有コードも既存のウィジェットもないことがあります。 この場合、SWT グラフィックス呼び出しを使用して、独自にウィジェットをドローしなければなりません。 この技法は、極めて複雑になる可能性がありますが、 完全に移植可能な実装を作り出すという利点があります。
カスタム・ドロー・コントロールは、以下の規則を使用して、 Canvas または Composite のクラスを サブクラス化することによって実装されます。
カスタム・ドロー・コントロールでは、内部状態が Java インスタンス変数に保存されます。ウィジェットの要件に応じて、 API およびスタイルを定義します。
カスタム・ドロー・ウィジェットの内部実装には、通常、 以下の主要なタスクが必要です。
org.eclipse.swt.custom で 実装された多くのウィジェットは、このアプローチを使用します。 簡単な例については、C ラベル を参照してください。
カスタム・ウィジェットの詳細については、 『 SWT を使用したユーザー独自のウィジェットの作成』を参照してください。