Java:Grahpicsとは何か?

 

JavaはGUIプログラミングがしやすい言語だと思うのですが、
それでも慣れるまでには色々な言葉の壁にぶつかります。

毎度、このブログの管理人イガジーです。

Javaで図形を描画しようとした時に戸惑うのが、Grahpics という
モノ(?)だと思います。

実際に描画する先(対象)は、Canvas だったりImageだったり、
BufferedImage で、これは何となく分かる気がするのですが
Grahpics というもの(?)がさっぱり分からない。
管理人イガジーは、それを理解するまでに1ヶ月くらいかかりました。

我流の解釈ですが、Grahpicsというのは「筆」です。

画用紙に絵を描く場合には、筆を使いますよね。(筆じゃなくとも、ペンでも
色鉛筆でもクレヨンでも、何でもいいですが、ひとつの例です ^^)
そして、その筆を手にして赤で描きたいときには、筆に赤い絵の具をつけます。
それをコマンド(プログラム)で書くと
g.setColor(Color.RED); // 赤にする
そして、筆で線を引いたり、円を塗りつぶしたりします。
それをコマンド(プログラム)で書くと
g.drawLine(10,10,200,10); // 線を引く
g.fillOval(20,20,100,100); // 円を塗る
となります。
このgがGraphics(筆)なのです。

この筆(Graphics)は、描く対象に結び付けられています。
例えば、Canvasの場合は paint() という関数が呼ばれる事に決まっていて
その引数として Graphics が与えられます。
つまり「筆を渡すから好きなように描け」と言われるわけです。

これらのことを頭に入れて、次のサンプルプログラムを眺めてください。
// import文は省略しています
public class GraSmple extends Frame {
private static final long serialVersionUID = 1L;
GraSmple(){ // constructor
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
M2Canvas cv=new M2Canvas();
this.add(cv,BorderLayout.CENTER);
this.setSize(300,200);
this.setVisible(true);
}
public static void main(String[] args) {
new GraSmple();
}
class M2Canvas extends Canvas {
private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g){
g.setColor(Color.RED);
g.drawLine(10,20,100,20);
g.fillOval(20,20,100,100);
}
}
}
後半の M2Canvas 内の paint() で、
渡された筆(Graphics)を使って描画しています。
※ これは、単純化したサンプルなので、あまり実用性はありません。

上記はCanvasでしたが、BufferedImage bi に描画する場合は、
Graphics g=bi.getGraphics();
として、BufferedImage bi 用の筆を用意します。
※ 順序としては、こうして筆を用意しておいてから、上記の描画コマンド
(g.setColor や g.drawLine など)を使います。
// import文は省略しています
public class GraSmple extends Frame {
private static final long serialVersionUID = 1L;
BufferedImage bi=new BufferedImage(300,200,BufferedImage.TYPE_INT_RGB);
GraSmple(){ // constructor
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
MyCanvas cv=new MyCanvas();
this.add(cv,BorderLayout.CENTER);
Graphics g=bi.getGraphics();
g.setColor(Color.BLUE);
g.drawLine(10,10,200,10);
g.fillOval(20,20,100,100);
this.setSize(300,200);
this.setVisible(true);
}
public static void main(String[] args) {
new GraSmple();
}
class MyCanvas extends Canvas {
private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g0){
g0.drawImage(bi, 0, 0, null);
}
}
}
Canvas では、描画済みの bi をpaintでコピーしています。
こちらの g は BufferedImage用の筆(Graphics)で、
paint()で渡されるGraphics(別の筆) は 混乱を避けるために
g0 という変数名にしています(同じ g という変数名にしても問題なく動きますが)。
※ こちらのサンプルの方が、汎用性があります。

すぐには理解できないかもしれませんが、あせらず、何度か読みなおしてみてください。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)