図形の描画のサンプルプログラム

java.awt.Graphics2D と java.awt.geomパッケージを用いて、 拡張されたグラフィックス機能による描画の実例を紹介しましょう。


・ 最初に座標変換の例として、 移動、拡大縮小、回転などの変換を利用する方法を取り上げます。 ソースの基本部分は次のようになります。


/** 描画メソッド */

  public void paint( Graphics g ) {

         ((Graphics2D)g).drawString( "Java", 10.0f, 30.0f );
          AffineTransform zoom = new AffineTransform( 
                          3.0f, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f );
          ((Graphics2D)g).setTransform( zoom );
          ((Graphics2D)g).drawString( "Java", 10.0f, 30.0f );
  }

上のプログラムに登場する座標変換は、 「縦横ともに 3倍に拡大する変形」を意味します。 したがって次のような実行結果を表示します。

Image

なお、よく用いられる拡大・縮小、回転、平行移動などは専用のメソッドが Graphics2Dに用意されています。 したがって上のサンプルは次のように記述することもできます。


/** 描画メソッド */

  public void paint( Graphics g ) {

       ((Graphics2D)g).drawString( "Java", 10.0f, 30.0f );
       ((Graphics2D)g).scale( 3.0f, 3.0f );
       ((Graphics2D)g).drawString( "Java", 10.0f, 30.0f );
  }

・ 次に図形のオブジェクトを描画する最も簡単なケースとして、 線分をその太さを指定して描く場合を取り上げます。 ソースの基本部分は次のようになります。


/** 描画メソッド */

  public void paint( Graphics g ) {

       Line2D.Float line1
          = new Line2D.Float( 10.0f, 10.0f, 90.0f, 90.0f );
       ((Graphics2D)g).draw( line1 );

       Line2D.Float line2
          = new Line2D.Float( 10.0f, 90.0f, 90.0f, 10.0f );
       BasicStroke bs = new BasicStroke( 5.0f,
             BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER );
       ((Graphics2D)g).setStroke( bs );
       ((Graphics2D)g).draw( line2 );
     }   

Strokeは描くべき図形の境界線を与えるためのインターフェイスです。 Graphics2D は内部に Strokeを実装したオブジェクトを保持し、 それによって図形を描きます。
BasicStrokeは Strokeを実装したクラスで、 線の太さ、線の端や交点の角の描き方、破線の設定などを行うためのクラスです。 太い線分を描くには次のような手順になります。

  1. Line2D.Floatのオブジェクトを生成する。
  2. BasicStrokeのオブジェクトを生成し、必要なデータを設定する。
  3. Graphic2Dに setStroke() で BasicStrokeのオブジェクトを設定する。
  4. draw( Shape ) メソッドで線を描く。

このパターンは Stroke 以外の Paint や Composite の場合も同じです。
上のプログラムに登場する BasicStrokeは、 「線の太さを 5、端は丸くする」ように指定します。 したがって次のような実行結果を表示します。

Image

・ サンプルプログラムのソースと解説: