ここで扱うGCとは、ガベージ・コレクタのことではありません。 Graphic Contextの略で、グラフィックを描画するための、システム側の仕事を指します。 グラフィカルプログラミングを行うには、まずはGCクラスを作成しなければなりません。
GCクラスには、2つのコンストラクタがあります。
GC(Drawable) GC(Drawable, int)第1引数に指定するのは、Drawableインターフェイスを実装した子クラスのオブジェクトです。 Image、Device、Controlと、それらの子クラスがそれにあたります。 GCクラスは、これに指定されたオブジェクトに対して、描画処理を行います 。 第2引数に指定するのは、GCに対するスタイルです。 これには、LEFT_TO_RIGHTとRIGHT_TO_LEFTがあり、 テキストを描画する際に、左から右か、右から左かを指定します。
GCクラスには、多数の描画のためのメソッドが用意されています。 これらのメソッドを呼び出すことで、コンストラクタに指定したDrawable実装オブジェクトへ描画を行います。
GCの最もシンプルな使い方は、canvasの上に描画することです。 なので、GCの最初の説明は、Canvasクラスの説明と平行して、こちらで紹介しています。 このページにこの後出てくる、CanvasクラスとPaintListener、PaintEventについては、まずCanvasを読まなければわからないと思います。
クリップ領域(clipping region)とは、Drawableウィジェットのうちの、ある特定の領域のことです。
この領域は、GC#setClippingメソッドによって設定することができます。
この領域を設定すると、その後のGCクラスの描画メソッドによる描画は、その領域内にのみ描画されるようになります。
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DrawToClippingRegion {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
Canvas canvas = new Canvas(shell, SWT.NONE);
canvas.setBounds(0, 0, 100, 100);
shell.pack();
shell.open();
GC gc = new GC(canvas);
// クリップ領域設定
gc.setClipping(25, 25, 50, 50);
// カラー作成
Color backgroundColor = new Color(display, 0xFF, 0x00, 0x00);
gc.setBackground(backgroundColor);
// canvas全体に描画を行う処理
gc.fillRectangle(0, 0, 100, 100);
// カラーリソース開放
backgroundColor.dispose();
// GCリソース開放
gc.dispose();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
クリップ領域を設定した後の描画は、その領域を超える描画を行ったとしても、
クリップ領域内にしか描画されません。
今回のプログラムでは、Colorクラスで作成した赤色をcanvas全体に表示しようとしていますが、
赤く描画されたのは座標(25, 25)から幅50,高さ50の領域だけです。
GCは、線や面といった図形だけでなく、文字列の描画もサポートしています。 文字列描画メソッドは、drawTextもしくはdrawStringメソッドがあります。
drawString(String string, int x, int y) drawString(String string, int x, int y, boolean isTransparent) drawText(String string, int x, int y) drawText(String string, int x, int y, boolean isTransparent) drawText(String string, int x, int y, int flags)すべてのメソッドで指定する必要のある、x引数とy引数には、描画開始位置を指定します。 string引数には、描画してほしい文字列を指定します。 isTransparent引数には、描画する文字列の背景を、透過色にするか否かを指定します。 flagsには、複数のビットフラグを指定します。
SWT.DRAW_DELIMITER // 改行文字があるとき、改行を試みる SWT.DRAW_TAB // タブを適切に描画する SWT.DRAW_MNEMONIC // ショートカットキー文字に下線をつける SWT.DRAW_TRANSPARENT // 描画する文字列の背景を透過色にするdrawTextメソッドのシグニチャによって、そのメソッドがデフォルトで、改行を行うのか、タブを処理するのか、ニモニック文字に下線をつけるのか、 描画文字の背景を透過色にするのかは異なるので注意して下さい。
drawStringメソッドは、改行も行わず、タブも処理せず、ニモニック文字に下線もつけず、 描画の背景色も透過色にしません。
GCによる文字列描画のサンプルを示します。

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DrawFont {
private static final String DRAWTEXT =
"きままにINDEXの後継、\nきままにインデックス(&k)";
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
Canvas canvas = new Canvas(shell, SWT.NONE);
canvas.setSize(400, 200);
shell.pack();
shell.open();
GC gc = new GC(canvas);
// 色の設定。システムカラーなのでリソース開放の必要がない。
Color fgColor = display.getSystemColor(SWT.COLOR_BLUE);
Color bgColor = display.getSystemColor(SWT.COLOR_YELLOW);
gc.setForeground(fgColor);
gc.setBackground(bgColor);
// 文字列描画
gc.drawString(DRAWTEXT, 10, 10);
gc.drawString(DRAWTEXT, 10, 60, true);
gc.drawText(DRAWTEXT, 10, 110,
SWT.DRAW_DELIMITER |
SWT.DRAW_MNEMONIC |
SWT.DRAW_TRANSPARENT);
// GCの保持するリソース開放
gc.dispose();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
drawStringメソッドは、改行されず、ニモニック文字も解釈されていません。
座標(10, 10)に描画した処理では、設定されている背景の色がそのまま描画されていますが、
その他の描画には背景の色が描画されていません。
座標(10, 60)に描画したものは、isTransparent引数がtrueだし、
座標(10, 110)に描画したものは、SWT.DRAW_TRANSPARENTフラグが設定されているからです。
また、座標(10, 110)に描画したものだけは、flag引数に設定したビットフラグにより、改行文字も解釈され、
ニモニック文字も解釈されて下線が引かれています。