2-1-5-1: Graphics2D とその関連クラス

Java 2 から拡張されたグラフィックス機能のうち、 描画を実行する新しいクラス Graphics2D と、 それに関連して新たに java.awtパッケージに追加されたクラスについて解説します。


・ JDK1.2 から拡張されたグラフィックス機能の中心となるのが Graphics2D という新しいクラスです。 それを理解するためのポイントはいくつかありますが、 ここでは下記のような順にしたがって解説していきます。

  1. Graphics2Dクラスについて
  2. Graphics2Dの新しい描画メソッド
  3. 描画の補助となる専用のクラス
  4. 座標変換のクラスとGraphics2Dのメソッド
  5. ハードウェアの情報を取得するための専用のクラス

・ java.awt.Graphics2D は java.awt.Graphics のサブクラスです。 Graphicsは描画処理を行うための基本的な手段を提供しました。 Graphics2Dはそれをさらに拡張し、より高度な機能を実現しています。 具体的には次のようなものです。

これらの機能を呼び出すために Graphics2Dには従来に比べてより一般化された描画メソッドが追加されています。 また、それを補助するための専用のクラスおよびインターフェイスが java.awt パッケージに追加されています。 Graphics2D は内部にそれらの情報を記憶します。 どんなクラスがどんな役割を果たすかは、この後に順次解説していきます。
Graphics2D は Graphicsと同じくシステムに依存しないように 設計された抽象クラスです。 したがってコンストラクタによって直接オブジェクトを生成することはできません。 通常はウィンドウのオブジェクトの描画メソッド paint() もしくは updata() が 呼び出される時に、その引数として自動的に渡されます。 (その際 JDK1.1以前との互換性のために、Graphicsとして取り扱います。)
Graphics2Dには、 システムやハードウェアの情報を取得する機能も追加されています。 こうした情報は抽象化された専用のクラスのオブジェクトとして表現されるため、 プログラムのコード自身はシステムに依存しません。

・ Graphics2Dで新たに追加された描画メソッドには次のようなものがあります。

Graphics2Dの新しいメソッド
メソッド名働き
void draw()領域の境界線の描画
void fill()領域の塗りつぶし描画
void clip()領域のクリッピングの設定
void drawRenderedImage()RenderedImageの描画
void drawRenderableImage()RenderableImageの描画

draw() と fill() は Graphicsクラスに用意されている従来の描画メソッド、 drawLine() や fillRect()などのメソッド群を一般化したものです。 引数には境界を持つ領域を表す Shape のオブジェクトが指定されます。 draw() は領域の境界線を、fill() は領域内の塗りつぶしを行います。 また、その際の境界線の太さや塗りつぶしパターンは Graphics2D に設定された 情報に基づきます。 これらのメソッドと Shapeの導入により、 線分、矩形、円弧以外の任意の形状の図形を描画することが可能となります。
clip()は引数で指定された Shapeの領域をクリッピングするように Graphics2Dに設定します。これも従来の矩形のクリッピングを拡張し、 任意の形状の図形に対応しています。
drawRenderedImage() と drawRenderableImage()は java.awt.image, java.awt.image.renderableパッケージに追加された RenderedImage および RenderableImageのオブジェクトを描画するメソッドです。
この他 drawImage() や drawString() のメソッドでも、 座標系の取り扱いの拡張に対応して引数の与え方が拡張されたものが追加されています。

・ Graphics2Dに設定される描画情報を表す専用のインターフェイスとクラスを示します。

描画に関する情報を表すインターフェイスとクラス
インターフェイス名クラス名働きGraphics2Dのメソッド
StrokeBasicStroke線の形状getStroke()
setStroke()
PaintGradientPaint
TexturePaint
色のグラジュエーション
タイルパターン
getPaint()
setPaint()
CompositeAlphaComposite図形の重ね合わせgetComposite()
setComposite()

Stroke は境界線の形状関する情報を、 Paint は内部の塗りつぶしの処理に関する情報を記憶します。 Composite は複数の図形のオブジェクトを重ね合わせて描画する際の情報を記憶します。 Stroke、Paint, Compositeともインターフェイスで、 実際にはそれらを実装したクラスのオブジェクトを生成して利用します。 java.awtには、線の太さや形状を指定するための BasicStroke、 領域内部を色のグラジュエーションをつけて塗りつぶす GradientPaint、 タイルパターンで塗りつぶす TexturePaint、 透過率を指定して図形を重ね合わせる AlphaCompositeのクラスが用意されています。 必要ならばこれら以外の Stroke, Paint, Comosite を実装したクラスを 独自に設計することも可能です。
Graphics2Dに情報を記憶させる(取り出す)ためには、 それぞれ setStroke(), getStroke(), setPaint(), getPaint(), setComposite(), getComposite()が用いられます。

・ Graphics2Dは座標系を線形変換する AffineTransformクラスのオブジェクトを内部に記憶しています。 AffineTransformクラスは2次元の線形変換に2次元の平行移動ベクトルを 加えた3行3列の変換行列を表します。
それらの情報を取り出したり再設定するためのメソッドの他、 現在の線形変換のオブジェクトにさらに変換をほどこすための メソッドがいくつか用意されています。 これらを用いると拡大縮小、回転などを簡単に実現できます。

座標変換のオブジェクトを操作する Graphics2Dのメソッド
メソッド名働き
AffineTransform getTransform()座標変換のオブジェクトの取得
void setTransform(AffineTransform t)座標変換のオブジェクトの設定
void translate()(現在の状態から)平行移動
void scale()(現在の状態から)拡大・縮小
void rotate()(現在の状態から)回転
void shear()(現在の状態から)歪める
void transform()(現在の状態から)任意の線形変換

デフォルトの変換のオブジェクトは Graphicsのピクセルに依存した座標系に 一致するように設定されています。 (コンポーネント内の左上の端が原点で、右および下方向に値が増加する。)

・ java.awt には、ハードウェアのグラフィック環境に関する 情報を表すためのクラスが追加されています。 (これらのクラス自身は抽象化され、システムに依存しません。) これらの情報は Graphics2Dに用意されている getDeviceConfiguration()を 用いて取得することができます。

ハードウェアに関する情報を表すインターフェイスとクラス
クラス名働きGraphics2Dのメソッド名
GraphicsDeviceデバイスの種類を表す-
GraphicsConfigurationデバイスの物理的な情報 getDeviceConfiguration()
GraphicsEnvironment複数のデバイスなどの集まり-