Graphics
Graphicsクラスは Objectクラスの直接のサブ・クラスです。
java.awtパッケージに含まれます。
Graphicsはグラフィック処理を実現する重要なクラスです。
使用する色やフォントなどの情報を記憶し、
多く図形を描くための「グラフィック関数」を提供します。
(画面に表示される図形そのものを表すクラスではありません。
むしろ、それらをコントロールするためのクラスだと考えてください。)
Graphicsクラスは abstractなクラスです。
グラフィックの処理は、一般にシステムの実装に大きく依存するからです。
したがって Graphicsのオブジェクトを、
プログラムの中でコンストラクタによって生成することはできません。
通常は「外から与えられたオブジェクトを利用する」ことになります。
Graphicsクラスには publicな変数は存在しません。
しかし、使用する色やフォントなどの情報は内部に記憶しています。
これらの変数にアクセスするには後述の専用のメソッドを用います。
Graphicsクラスのメソッド
Graphicsクラスには、
引数の区別もすると全部で 40個余りのメソッドが定義されています。
メソッドの目的ごとに以下の項目のようにグループ分けして解説します。
- 基本図形を描くメソッド
- 文字列やイメージを描くメソッド
- 図形のコピーやクリアを行うメソッド
- 色やフォントなどのデータへのアクセスを行うメソッド
- 座標系の操作のメソッド
- Graphicsのオブジェクト自身を操作するメソッド
基本図形を描くメソッド
- public abstract void drawLine(int x1, int y1, int x2, int y2)
- public void drawRect(int x, int y, int width, int height)
- public abstract void fillRect(int x, int y, int width, int height)
- public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
- public abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
- public void draw3DRect(int x, int y, int width, int height, boolean raised)
- public void fill3DRect(int x, int y, int width, int height, boolean raised)
- public abstract void drawOval(int x, int y, int width, int height)
- public abstract void fillOval(int x, int y, int width, int height)
- public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
- public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
- public abstract void drawPolygon(int xPoints[], int yPoints[], int nPoints)
- public void drawPolygon(Polygon p)
- public abstract void fillPolygon(int xPoints[], int yPoints[], int nPoints)
- public void fillPolygon(Polygon p)
Graphicsクラスは基本的な図形を描くためのメソッドを提供します。
JDK 1.0 では図形は全て2次元のもので、線分(Line)、長方形(Rect)、
角が丸い長方形(RoundRect)、陰影付きの長方形(3DRect)、楕円(Oval)、
円弧(Arc)、多角形(Polygon)が提供されています。
drawで始まるメソッドは図形の輪郭のみを描き、
fillで始まるメソッドは図形の内部を塗りつぶします。
それぞれの図形ごとにメソッドの引数の意味、注意点をまとめておきましょう。
- Line
線分の両端の座標を与えます。
- Rect
最初の2つの引数は長方形の左上端の座標です。
次の2つの引数は長方形の横幅、高さを与えます。
- RoundRect
最初の2つの引数は長方形の左上端の座標です。
次の2つの引数は長方形の横幅、高さを与えます。
最後の2つの引数はコーナーの丸くする部分の横幅と高さを与えます。
- 3DRect
最初の2つの引数は長方形の左上端の座標です。
次の2つの引数は長方形の横幅、高さを与えます。
最後の引数は陰影の付け方をコントロールします。
true ならば長方形は「飛び出して」見え、
false ならば長方形は「へこんで」見えます。
陰影に対応する色は自動的に調整されます。
- Oval
最初の2つの引数は楕円を取り囲む長方形の左上端の座標です。
次の2つの引数は楕円を取り囲む長方形の横幅、高さを与えます。
中心の座標や半径を与えるわけではないことに注意してください。
- Arc
最初の2つの引数は円弧を取り囲む長方形の左上端の座標です。
次の2つの引数は円弧を取り囲む長方形の横幅、高さを与えます。
中心の座標や半径を与えるわけではないことに注意してください。
最後の2つの引数は円弧を描き始める角度と描く角度の量を
与えます。単位は度です。
したがって最後の引数に 360 を与えれば常に完全な円になります。
- Polygon
引数の指定法は2通りあります。
1つは、多角形の各頂点の X座標の値の配列と Y座標の値の配列
および点の個数を直接指定する方法です。
あるいは Polygonクラスのオブジェクトを与えることもできます。
Polygonクラスは 各頂点の X座標の値の配列と Y座標の値の配列
および点の個数を public変数に持つ単純なクラスです。
引数の与え方に多少クセがあるように感じるでしょう。
特に Arc や Polygonなど、あまりスマートではありません。
これは Xlib のグラフィック関数のルールを引き継いでいるせいです。
「ベストの記法ではないが従来のものに合わせる」という方針なのでしょう。
文字列やイメージを描くメソッド
- public abstract void drawString(String str, int x, int y)
- public void drawChars(char data[], int offset, int length, int x, int y)
- public void drawBytes(byte data[], int offset, int length, int x, int y)
- public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer)
- public abstract boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
- public abstract boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
- public abstract boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
文字列を描くメソッドとして drawString(), drawChars(), drawBytes()があります。
drawChars()もdrawBytes()も文字のデータを Stringクラスのオブジェクトに
変換して最終的には drawString()を呼び出します。
drawChars()とdrawBytes()の第2および第3引数は、
それぞれの配列のデータの何番目からスタートし、
何文字分のデータを表示したいかを指定します。
drawString()の最後の2つの引数は文字列を描き始める点の座標です。
文字列の場合はフォントのベースラインの左端の点です。
他の基本図形のように左上端の点ではないので注意してください。
Imageのオブジェクトを表示させるメソッドが drawImage()です。
drawImage()には以下のデータが必須です。
描きたい Imageのオブジェクト、イメージの左上端の X座標と Y座標、
ImageObserverのオブジェクト(通常はアプレット自身)の4つです。
この他に、表示されるイメージの横幅と高さおよび背景色を指定することもできます。
サイズの値は表示したいサイズで、
イメージ自身のサイズと一致する必要はありません。
イメージは自動的に拡大・縮小されて描かれます。
背景色の指定が有効になるのは、
イメージが「背景の透明化」の処理を受けている場合のみです。
図形のコピーやクリアを行うメソッド
- public abstract void clearRect(int x, int y, int width, int height)
- public abstract void copyArea(int x, int y, int width, int height, int dx, int dy)
clearRect()メソッドは、
指定された長方形の領域のグラフィックの内容をクリアします。
copyArea()メソッドは、最初の4つの引数で指定された長方形の領域の
グラフィックの内容を記憶し、最後の2つの引数で指定された場所にコピーします。
色やフォントなどのデータへのアクセスを行うメソッド
- public abstract Font getFont()
- public abstract void setFont(Font font)
- public FontMetrics getFontMetrics()
- public abstract FontMetrics getFontMetrics(Font f)
Graphicsのオブジェクトが現在使用しているフォントを得るには
getFont()メソッドを、設定するには setFont()メソッドを用います。
やり取りされるのは Fontクラスのオブジェクトです。
FontMetricsのオブジェクトを得るためのメソッドが getFontMetrics()です。
引数に Fontのオブジェクトを与えますが、省略すると Graphicsが現在使用
しているフォントに対応する FontMetricsのオブジェクトが返されます。
- public abstract Color getColor()
- public abstract void setColor(Color c)
- public abstract void setXORMode(Color c1)
- public abstract void setPaintMode()
Graphicsが現在使用中の色を得るには getColor()メソッドを、
設定するには setColor()メソッドを用います。やり取りされるのは
Colorクラスのオブジェクトです。
基本図形や文字列は、この Colorのオブジェクトを利用して描かれます。
図形を描く時に、その下に既にある図形との重なりをコントロールしたい
場合もあります。このような細かい操作に対して JDK 1.0はまだ十分な
機能を提供していません。
今のところ setPaintMode() と setXORMode()という2つのメソッドを利用できます。
setXORMode()メソッドは描画のモードを変更して、
指定された色と背景のピクセル値のビットごとの
排他論理和をとって描画します。
2度繰り返して描画すると背景の状態が復活するので、
ラバー・バンドなどの描画に活用できます。
setPaintMode()メソッドは通常の上書きモードの設定に戻します。
座標系の操作のメソッド
- public abstract void translate(int x, int y)
- public abstract void clipRect(int x, int y, int width, int height)
- public abstract Rectangle getClipRect()
translate()メソッドは、指定された位置に座標の原点を移動します。
clipRect()メソッドは、指定された長方形の領域のみを描画の対象に限定します。
いずれのメソッドもグラフィック処理を直接行うのではなく、
その後に呼び出されるグラフィック命令に影響を与えるためのものです。
また、内部のコンポーネントの描画を実行する場合にもしばしば利用されます。
現在のクリップされた領域を知るためには getClipRect()メソッドを用います。
Graphicsのオブジェクト自身を操作するメソッド
- public abstract Graphics create()
- public Graphics create(int x, int y, int width, int height)
- public abstract void dispose()
- public void finalize()
- public String toString()
create()メソッドは、Graphicsのオブジェクトのコピーを生成します。
create()という名前が付いていますが、全く新しく Graphicsのオブジェクトを
生成するわけではありません。
通常は Graphicsのオブジェクトは1つあれば十分ですが、
場合によっては複数の Graphicsのオブジェクトを利用することがあります。
例として、複数の色をひんぱんに切り換えて描画する場合、
複数のサブ・コンポーネントの描画をランダムに繰り返すような場合が
考えられます。これらの場合、色や座標の情報を描画ごとに再設定し直して
から描画するよりも、複数の Graphicsのオブジェクトを用いた方が
効率が良くなることもあります。
create()メソッドに新しい原点の位置と有効な領域の範囲を引数として与える
こともできます。
dispose()およびfinaze()メソッドは Graphicsのオブジェクトを
明示的に消去します。JDK 1.0 では両者の働きは全く同一です。
toString()は Graphicsのオブジェクトの情報を Stringクラスのオブジェクトと
して返します。返値には現在使用中の色およびフォントの情報が含まれています。