場合によっては、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 を使用したユーザー独自のウィジェットの作成』を参照してください。