Javaプログラミング/Javaプログラミング関連情報

Graphics2Dに挑戦!

Graphicsの高性能版「Graphics2D」を使って、より高度なグラフィック表現を目指そう!

執筆者:掌田 津耶乃

Graphics2Dとは?


さて、先の連載で「Graphics」クラスを使った描画について簡単に説明しました。が、中には「ずいぶんと貧弱な機能しかないんだな」と思った人もいるかも知れません。Graphicsクラスは、Javaが誕生した当初から用意されていたもので、正直、かなり機能的には弱いものなのです。

そこで、Swingが登場したとき、同時に「Graphicsクラスを強化した新Graphicsクラス」というものも用意されました。「Graphics2D」というクラスです。実をいえば、皆さんが普段使っているGraphics(paintComponentで引数で渡されるGraphicsインスタンス)は、本当はGraphicsではなく、Graphics2Dなのです。

Grapihcs2Dを用意したとき、「それまでGraphicsとして引数などが設計されていたメソッド類との互換性をどうするか」という問題が出てきました。すべてGraphics2Dに変えてしまったら、それ以前のプログラムとは互換性がなくなってしまいます。そこで、Graphics2Dを「Graphicsのサブクラス」として作成し、Grapihcsが引数に渡されるメソッドなどでは、「Graphics2DインスタンスをGraphicsにキャストして渡す」ようにしたのです。

ということは? 特別な作業などしなくとも、既に皆さんは「いつでもGraphics2Dが使える」状況にあるのですね。ただ、引数で渡されたGraphicsを、Grapihcs2Dにキャストするだけでいいのです。


シェイプの利用


それでは、実際にGraphics2Dを利用してみることにしましょう。まずは、Graphicsにもあったような「簡単な図形の描画」から行ってみましょう。

package jp.allabout;

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class SampleApp extends JFrame {
  
  public SampleApp(){
    this.setSize(300, 300);
    this.add(new GPanel(), BorderLayout.CENTER);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  
  public static void main(String[] args) {
    new SampleApp().setVisible(true);
  }
}

class GPanel extends JPanel {

  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    int w = this.getWidth();
    int h = this.getHeight();
    for(int i = 0;i < 10;i++){
      Ellipse2D shape = new Ellipse2D.Double(0,0,w,h - i * (w / 10));
      g2.setPaint(new Color(0,0,255,25));
      g2.fill(shape);
    }
  }
}

これは、半透明の楕円を重ねて描いてみたものです。「おお! Graphics2Dになると、こんなこともできるのか!」……と思ったかもしれません。が、実はこれはGraphicsでもできます(Colorに半透明の属性をつけているだけです)。ですから、GraphicsでもGraphics2Dでも、このようなサンプルは作れます。ここでは「両者の違い」に重点を置いて理解してください。


  • 1
  • 2
  • 3
  • 4
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます