上の青い円の近くをclickするとmouseを追いかけて円が動きます。

source は以下のとおりです。

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

public class InitPaintUpdate1 extends Applet {
  int x = 150, y = 50;

  public void init() {
    setBackground(Color.white);
    setForeground(Color.blue);
  }

  public void paint(Graphics g) {
    g.fillOval(x - 10, y - 10, 20, 20);
  }

  public boolean mouseDown(Event e, int x, int y) {
    this.x = x;  this.y = y;
    repaint();
    return true;
  }
}

最初の import java.awt.* は, Java の AWT(Abstract Window Toolkit) をimport(輸入)する,ということです。 graphic関係の命令を使うときには, AWT をimportしておく必要があります。

このclass Lesson2 はpublic修飾子がついているので外部のすべてのmethod から利用可能です。

class Lesson2 は, Java 開発キットに付属している java.applet.Applet というクラス を拡張(extend)したものです。 これは Lesson2 というクラスで定義されていない命令などは, java.applet.Applet というクラスで定義されているものをそのまま使う という意味です。 applet(Web browserから実行する Javaのprogram)は 必ず java.applet.Applet を extend したものにしなければなりません。

次の int x = 150, y = 50; は, 整数型(int 型)の変数 x,y を作り, それぞれ初期値を 150,50 にします。

このclassを WWW browserで実行したとき, 最初にこの中の init() の部分が実行されます。 この init() は, setForeground(Color.blue) つまり描く色を青に設定します。

Browserは,init() の後に paint() という命令を実行します。 また,appletが何らかの理由で画面から消えた後, 再度画面内に現れたときも,やはり paint() を実行します。 これ以外のときに,強制的に paint() を実行したいときには, プログラムの中で repaint() という命令を使います。 このプログラムでは,後述の mouseDown() の中で repaint() を呼び出しています。 paint() を直接呼び出すのではなく, repaint() を呼び出すことになっています。

mouseDown() は, appletの中でmouseのbuttonを押したときに呼び出される命令です。 ここではmouseの座標を保存し, repaint() を実行しています。

paint() と update()

appletが repaint() という命令を実行すると, browserがそのappletの paint() を呼び出すと言いましたが, 正確に言えば, repaint() はappletの update() という命令を呼び出します。 defaultの update() の定義は次のようになっています。

    public void update(Graphics g) {
        g.setColor(getBackground());     // 背景色を得る
        g.fillRect(0, 0, width, height); // それで塗りつぶす
        g.setColor(getForeground());     // 前景色を得る
        paint(g);                        // paint(g) を呼び出す
    }
つまり,applet全体を背景色で塗りつぶしてから, paint(g) を呼び出しています。
Applet classの親は Panel class,Panel の親は Container, Container の親は Component です。 update() は Component classで定義されています。

さきほどのprogramに

    public void update(Graphics g) {
        paint(g);
    }
という3行を挿入すると,次のようになります。つついてみてください。

これは,もともとある update() の定義が,この新しい定義で 置き換えられたからです。このことを method のオーバーライドといいます。