SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

サーバサイドではじめるJavaグラフィック講座

Graphics2Dによる描画

サーバサイドではじめるJavaグラフィック講座 2


塗りつぶしと線分情報

 図形の描画には「線分の描画」と「図形の塗りつぶし」があります。従来の方式であれ、Shapeを使った描画であれ、この点は変わりありませんね。が、従来式では、描画時の「線」や「塗りつぶし方」に関する設定というのが行なえませんでした。このため、非常に単純な線の描画と塗りつぶししかできないという欠点がありました。Graphics2Dでは、この点もかなり強化されています。

 先に作成したサンプルで、このような文が書かれていたのに気づいたでしょう。

g.setStroke(new BasicStroke(3f));

 これは、線分の太さを変更するものだったのです。Graphics2Dでは、描画する線分に関する情報を扱う「java.awt.Stroke」と、塗りつぶしに関する情報を扱う「java.awt.Paint」というインターフェイスが用意されています。また、これらを実装したクラスとしていずれも数種類のものが用意されています。以下に整理しておきましょう。

Stroke実装クラス
クラス名説明
java.awt.BasicStroke一般的な線分のクラスです。線の太さ、両端および交点の形状(装飾)、点線破線の設定などの情報が収められています。
Paint実装クラス
クラス名説明
java.awt.Color実は、現在のColorクラスもPaintが実装されています。一般的な塗りつぶしならば、ColorをそのままPaintとして設定できます。
java.awt.GradientPaint般的な線形グラディエーションパターンによる塗りつぶしを行うためのものです。2つの点の位置と各点の色の情報を持っており、それらを元にグラディエーションする塗りつぶしを行なえます。
java.awt.TexturePaintビットマップイメージによるテクスチャーを使って塗りつぶすためのものです。テクスチャーとなるBufferedImageを持っており、これを使って塗りつぶしを行います。

 Strokeは、BasicStrokeを使うことにより、線の太さや先端形状、点線破線などを一通り設定することができます。Paintは、グラディエーションを使った塗りつぶしGradientPaintとテクスチャーを使った塗りつぶしTexturePaintが用意されています(一般的な単色による塗りつぶしはColorを使います)。

 では、これもサンプルをあげておきましょう。ここでは背景をグラディエーションして描き、円の線の太さを次第に細くしながら描画を行ってみます。

public void paint(Graphics2D g){
    g.setPaint(new GradientPaint(0f,127f,Color.BLUE,
                                 255f,127f,Color.RED));
    g.fillRect(0, 0, 255, 255);
    Ellipse2D.Double elps = new Ellipse2D.Double(0d,0d,100d,100d);
    AffineTransform defaultAT = g.getTransform();
    for(int i = 0;i < 16;i++){
        g.setStroke(new BasicStroke(8f - 0.5f * i));
        Color c = new Color(0,255,255 - i * 16);
        g.setPaint(c);
        g.draw(elps);
        g.translate(10,10);
    }
    g.setTransform(defaultAT);
    g.setColor(Color.WHITE);
    g.drawString("ok,boss.",10,255);
}
GradientPaintとBasicStrokeを使い、グラディエーションによる塗りつぶしと線の太さを変更した描画を行なってみた。
GradientPaintとBasicStrokeを使い、グラディエーションによる塗りつぶしと線の太さを変更した描画を行なってみた。

 ここでは、まず背景を塗りつぶすのにGradientPaintを作成し、これをGraphics2Dに設定しています。

g.setPaint(new GradientPaint(0f,127f,Color.BLUE,255f,127f,Color.RED));

 GradientPaintは、グラディエーションの開始地点の位置と色、および終了地点の位置と色の計6つのパラメータを渡してnewするのが一般的です。そして作成したインスタンスを「setPaint」でGraphics2Dに設定します。これで塗りつぶすためのPaintが設定されます。

 その後で、fillRectを使って描画を行なっていますね。fillRectは、Graphics2D以前のGraphicsから用意されていた旧来の描画メソッドです。新しいShapeによる描画だけでなく、それまでの描画メソッドでも、PaintStrokeによる設定は反映されます。

 次に、for内で行なっている線分の変更についてです。ここではBasicStrokeを使い、次のようにして線分情報を設定しています。

g.setStroke(new BasicStroke(8f - 0.5f * i));

 BasicStrokeは、単純に線の太さを示すfloat値だけを引数に渡せば、その太さの線分情報を表すインスタンスを作成することができます。これを「setStroke」でGraphics2Dに設定すれば、以後の線分描画で描かれる線が変更されるわけです。BasicStrokeにはこの他にもコンストラクタがいくつか用意されており、他の引数を設定することで先端の形状や点線の情報などを指定することができます。

 また、ここでは線の色を設定するのにこんなことをやっていますね。

Color c = new Color(0,255,255 - i * 16);
g.setPaint(c);

 忘れがちですが、Colorも立派なPaint実装クラスです。ですので、setPaintで設定することができます。もちろん、setColorを使って設定してもかまいません。どちらを利用しても効果は同じです。

まとめ

 以上、Graphics2Dの最も大きな特徴であるShapeによる描画、座標変換、塗りつぶし・線分情報の設定について説明しました。これらを実際に使ってみれば、Graphicsよりはるかに高度な描画を行なえることがよく分かるでしょう。

 AWTやSwingなどを一通り使っている人でも、描画に関しては「Graphicsからある機能中心で、Graphics2D特有の機能はほとんど知らない」という人が多いものです。今回紹介した機能だけでも使いこなせるようになれば、描画の表現力は格段にアップするはずですよ。

 図形の描画については大体わかってきましたので、次回はビットマップイメージの利用について考えてみることにしましょう。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
サーバサイドではじめるJavaグラフィック講座連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1021 2007/03/28 12:44

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー