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); } } |
void drawString(String str,int x,int y)
文字列を表示します。
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( )が実行されるタイミング |
もう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が実行されました"); } } |
<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が実行されました"); } } |
<HTML> <BODY> <APPLET CODE="MyUpdate.class" width="200" height="100"> </APPLET> </BODY> </HTML> |
C:\java_test>appletviewer MyUpdate.html init() start() paintが実行されました updateが実行されました |