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文は省略しています
後半の M2Canvas 内の paint() で、
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);
}
}
}
渡された筆(Graphics)を使って描画しています。
※ これは、単純化したサンプルなので、あまり実用性はありません。
上記はCanvasでしたが、BufferedImage bi に描画する場合は、
Graphics g=bi.getGraphics();
として、BufferedImage bi 用の筆を用意します。
※ 順序としては、こうして筆を用意しておいてから、上記の描画コマンド
(g.setColor や g.drawLine など)を使います。
// import文は省略しています
Canvas では、描画済みの bi をpaintでコピーしています。
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);
}
}
}
こちらの g は BufferedImage用の筆(Graphics)で、
paint()で渡されるGraphics(別の筆) は 混乱を避けるために
g0 という変数名にしています(同じ g という変数名にしても問題なく動きますが)。
※ こちらのサンプルの方が、汎用性があります。
すぐには理解できないかもしれませんが、あせらず、何度か読みなおしてみてください。
この記事へのコメントはこちら