2. グラフィックの表示

グラフィック機能について説明します。

(1) paint( ) は画家、Graphics はペン

 アプレットのプログラムではグラフィックの機能を簡単に使うことができます。 前回のアプレットプログラムの中にpaint(Graphics g) というメソッドがあったことを覚えていますか?

このpaint( )というメソッドがグラフィック表示をするためのメソッドです。このあと詳しく説明しますが、paint( ) メソッドも呼ばれるタイミングが決まっています。paint( ) メソッドの引数の Graphics オブジェクトはグラフィックの描画の必要があるときに、自動的に paint( ) に渡されます。

Graphics クラスは java.awt パッケージのクラスです。

  MyApplet.java

import java.awt.*;
import java.applet.Applet;

public class MyApplet extends Applet {
    public void init() {
        System.out.println("init()");
    }
    public void start() [
        System.out.println("start()");
    }
    public void stop() {
        System.out.println("stop()");
    }
    public void destroy() {
        System.out.println("destroy()");
    }
    public void paint(Graphics g) {
        g.drawString("Hello! Everyone!",10,50);
    }
}

 paint( ) が絵を描く人で、この人は Graphics オブジェクトというペンを使って絵を描くと考えてください。
 絵や文字を書くメソッドは Graphics クラスにあります。いくつか例を挙げると、

void drawLine(int x1,int y1,int x2,int y2)
座標(x1,y1)から(x2,y2)まで線を引きます。

void drawRect(int x,int y,int width,int height)
座標(x,y)を左上の点とし、幅 width 、高さ height の四角を描きます。

void fillRect(int x,int y,int width, int height)
座標(x,y)を左上の点とし、幅 width 、高さ height の塗りつぶした四角を描きます。

void drawOval(int x,int y,int width,int height)
座標(x,y)を左上の点とし、幅 width 、高さ height の円を描きます。

void fillOval(int x,int y,int width, int height)
座標(x,y)を左上の点とし、幅 width 、高さ height の塗りつぶした円を描きます。

そのほかのメソッドは API ドキュメントを参照してください。

(2) paint( )が実行されるタイミング

 paint( )メソッドは自動的に実行されるメソッドです。 まず、アプレットの起動時に実行されます。 ですから、前回の例題では paint( )メソッドの呼び出しを書かなくても文字が表示されたのです。

 もう1つのタイミングは、アプレットの領域を再描画する必要があるときです。たとえば、appletviewer で起動した場合、これを最小化して元に戻したときなどがあります。

 次の例題を実行し、アプレットをアイコン化したり元に戻したりと何回か繰り返すと、丸が違う位置に表示されます。また、MS-DOS プロンプトに表示される文字列とアプレットに描画される文字列で、paint が実行されるときがわかります。

  MyPaint.java

import java.awt.Graphics;
import java.applet.Applet;

public class MyPaint extends Applet {
    public void paint(Graphics g) {
        int x = (int)(Math.random() * 180);
        int y = (int)(Math.random() * 180);
        g.drawOval(x,y,20,20);
        System.out.println("paintが実行されました");
    }
}


  MyPaint.html

<HTML>
<BODY>
<APPLET CODE="MyPaint.class" width="200" height="200">
</APPLET>
</BODY>
</HTML>


(3) 再描画の方法

 さて、paint( ) は自動的に呼ばれるメソッドと説明しましたが、好きなときに再描画を行うこともできます。再描画を行うにはrepaint( )というメソッドを使います。しかし、repaint( ) は直接 paint( ) を呼び出しません。

 Java では描画用のメソッドとして、paint( )、repaint( )、update( ) の3種類があります。この3つのメソッドは、Applet クラスのスーパークラスの Component クラスから継承しています。グラフィックの機能を使いたい場合は、このうち paint( ) と update( ) をオーバーライドします。

void update(Graphics g)
グラフィックスを描画します。repaint( ) 実行時に呼び出されます。

void repaint( )
再描画の指示を出します。

 これらの3つのメソッドの関係は次のようになります。

 任意のタイミングで再描画したい時は repaint( ) を実行します。すると update( ) がオーバーライドされているか確認されます。もし update( ) がオーバーライドされていれば、その処理が実行され再描画は終了します。

 update( ) がオーバーライドされていない場合は、デフォルトの処理として背景色で塗りつぶす作業をします。そのあと paint( ) がオーバーライドされていればその処理を行い、再描画の処理がおわります。

  MyUpdate.java

import java.awt.Graphics;
import java.applet.Applet;

public class MyUpdate extends Applet {
    public void init() {
        System.out.println("init()");
    }

    public void start() {
        System.out.println("start()");
    }
    public void paint(Graphics g) {
        g.drawString("paintによる描画",10,20);
        System.out.println("paintが実行されました");
        repaint();
    }
    public void update(Graphics g) {
        g.drawString("updateによる描画",10,40);
        System.out.println("updateが実行されました");
    }
}


  MyUpdate.html

<HTML>
<BODY>
<APPLET CODE="MyUpdate.class" width="200" height="100">
</APPLET>
</BODY>
</HTML>


 この例題を実行すると、アプレットには2つ文字列がでてきます。

 実行例  (画像をクリックすると実際の MyUpdate.html とアプレットが起動します)



 MS-DOSプロンプトには次のように表示され、init( )、start( ) とライフサイクルメソッドが実行され、アプレットの実行開始時に paint( ) が実行されています。paint( ) には repaint( ) があるので、ここで update( ) が実行されているのがわかります。

C:\java_test>appletviewer MyUpdate.html
init()
start()
paintが実行されました
updateが実行されました

start( ) 内に repaint( ) を入れると、アプレットを最小化して元に戻したとき、表示される文字列が1つになっていまいます。これは paint( ) 実行時には必ず背景色で塗りつぶしをしているためだと思われます。

前の章(1.アプレットの作り方)   次の章(3.色とフォント)