グラフィックス

SWT には、ウィジェットでグラフィックスをドローしたり、 イメージを表示するためのグラフィックス・エンジンが組み込まれています。 アイコン、テキスト、およびその他のデータのペイントはウィジェットで処理されるため、 グラフィック・インターフェースにプログラミングしなくても多くの処理を実行することができます。 ただし、アプリケーションにカスタム・グラフィックスを表示する場合や、 カスタム・ドロー・ウィジェットを実装している場合は、SWT の基本的なドロー・オブジェクトに関して理解する必要があります。

グラフィックス・コンテキスト

グラフィックス・コンテキスト GC は、 SWT グラフィックスをサポートするためのフォーカル・ポイントです。この API は、SWT のドロー機能をすべて記述します。

GC を使用すると、 コントロール上 (最も一般的な場合)、イメージ上、ディスプレイ上、またはプリンターにドローできます。 コントロール上でドローするときは、コントロールのペイント・イベントで提供される GC を使用します。 イメージ上、ディスプレイ上、またはプリンターにドローするときは、そのために構成された GC を作成し、使用後に GC を廃棄する必要があります。

GC を用意した後、色、線の幅、フォントなど、 GC でドローされたグラフィックスの外観を制御する属性を 設定することができます。

グラフィック機能の完全セットについては、 『GC の API 解説書』を参照してください。

フォント

Font および FontData クラスは、 SWT でフォントを操作するときに使用します。

FontData はフォントの特性を記述します。FontData を作成するには、 フォント名、スタイル、およびサイズを指定します。 FontData にはこれらの属性を照会するための API が含まれています FontData によって OS のリソースが割り振られることはないため、リソースを廃棄する必要はありません。

Font は、 ドロー API で使用されるフォントを表す実際のグラフィックス・オブジェクトです。 Display 用 Font を作成するには、必要なフォントの Display および FontData を指定します。Font を照会して、その FontData を探すこともできます。

使用後に、割り振られた Font を廃棄する必要があります。

カラーはフォントと似ています。Display 用 の Color を作成するには、 目的の色の RGB 値を指定します。 使用後に、割り振られた色を廃棄する必要があります。

Display メソッド getSystemColor(int) を 使用すると、OS プラットフォームに事前定義されたシステムの色を照会できます。 この技法を使用して取得したカラーは解放しないでください。

色のモデルの詳細については、 『SWT の色のモデル』を参照してください。

イメージ

SWT でイメージを操作する場合は、ImageImageData、 および ImageLoader クラスを使用します。

ImageData は、使用される 色の値を記述する PaletteData クラスを 使用して、イメージ内の実際のピクセルを記述します。ImageData は、 装置やプラットフォームに依存しないイメージの記述です。

ImageLoader は、ImageData を さまざまなファイル・フォーマットでロードおよび保管します。 現在、SWT は、BMP (Windows ビットマップ)、ICO (Windows アイコン)、JPEGGIF、 および PNG などのイメージ・フォーマットのロードおよび保管をサポートしています。

Image は、 ドロー API で使用されるイメージを表す実際のグラフィックス・オブジェクトです。 特定の Display に対するイメージを作成します。 イメージは次に示すいくつかの方法で作成することができます。

Image の作成方法に関係なく、 作成したイメージを廃棄する必要があります。

グラフィックス・オブジェクトのライフ・サイクル

SWT でドローするために使用される大部分のグラフィックス・オブジェクトによって基本 OS のリソースが割り振られるため、 グラフィックス・オブジェクトは明示的に解放する必要があります。 以前の説明と同じ規則がここでも適用されます。 コンストラクターを使用して作成されたものは、解放する必要があります。 他の場所からアクセスしている場合は、それは解放しないでください。

作成

グラフィックス・コンテキスト、フォント、カラー、イメージなどのグラフィックス・オブジェクトは、 オブジェクトの作成直後に OS に割り振られます。 グラフィックス・オブジェクトの使用方法に応じて、これらの作成時期が決まります。

アプリケーション全体で頻繁に使用されるグラフィックス・オブジェクトは、ウィジェットを作成するときに作成します。 通常は、色とフォントにこの方法を使用します。 それ以外の場合は、オンザフライでグラフィックス・オブジェクトを作成することをお勧めします。 例えば、いくつかの計算を実行するために、ウィジェット・イベント・ハンドラーの 1 つにグラフィックス・コンテキストを 作成できます。

カスタム・ウィジェットを実装していて、グラフィックス・オブジェクトを常に使用する場合は、 通常、コンストラクターにグラフィックス・オブジェクトを割り振ります。 グラフィックス・オブジェクトを常に使用しない場合、または特定の属性の状態に依存する場合は、 オンザフライでこれらを割り振ることができます。

ペイント

グラフィックス・オブジェクトの割り振り終了後、ペイントすることができます。 ペイントは、常にペイント・リスナー内部で行ってください。 まれに、他のイベントに応答している間にペイントする場合があります (特に、カスタム・ウィジェットを 実装している場合)。 ただし、この方法は一般にお勧めしません。 他のイベントの処理中にペイントする必要がある場合は、 最初に redraw() メソッドを使用して、OS 内に別のペイント・イベントを生成する必要があります。 ペイント・メソッド外部でドローすると、プラットフォームが最適化されなくなり、 イベント・キュー内で保留中のペイント数によっては、バグが発生することがあります。

ペイント・イベントを受け取ると、ウィジェットでのドロー用に 事前構成された GC が提供されます。 この GC は 解放しないでください。 これはユーザーが作成したものではありません。

その他のグラフィック・オブジェクトは、イベントの処理中 (また処理前) に割り振る必要があります。 org.eclipse.swt.examples.HelloWorld5 のサンプルの一部を次に示します。 カラー red は、ウィジェットを作成したときに割り当て済みであるため、ここで使用することができます。

   shell.addPaintListener (new PaintListener () {
      public void paintControl (PaintEvent event) {
         GC gc = event.gc;
         gc.setForeground (red);
         Rectangle rect = event.widget.getClientArea ();
         gc.drawRectangle (rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
         gc.drawString (resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
      }
   });

廃棄

ユーザーが割り振ったすべてのグラフィック・オブジェクトは、使用後に解放する必要があります。

廃棄のタイミングは、オブジェクトの作成時期に応じて異なります。 ウィジェットの作成中にグラフィック・オブジェクトを作成した場合は、通常、ウィジェットを廃棄するときに、 ウィジェットに廃棄リスナーを追加してグラフィックスを廃棄する必要があります。 ペイント中にオブジェクトをオンザフライで作成した場合は、ペイントが終了するときに廃棄する必要があります。

次のコードの断片は、ペイント・リスナーを一部修正したバージョンです。 この例では、ペイント中に、カラー red を割り振って、解放します。

   shell.addPaintListener (new PaintListener () {
      public void paintControl (PaintEvent event) {
         GC gc = event.gc;
         Color red = new Color (event.widget.getDisplay (), 0xFF, 0, 0);
         gc.setForeground (red);
         Rectangle rect = event.widget.getClientArea ();
         gc.drawRectangle (rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
         gc.drawString (resHello.getString ("Hello_world"), rect.x + 20, rect.y + 20);
         red.dispose ();
      }
   });