レッスン2

上の黄色い円の近くマウスでつついてください。円がマウスの後を追います。

これは次のようにして作りました。


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

public class Lesson2 extends Applet implements MouseListener {
    int x = 150, y = 50;

    public void init() {
        setForeground(Color.yellow);
        addMouseListener(this);
    }

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

    public void mousePressed(MouseEvent e) {
        x = e.getX();  y = e.getY();
        repaint();
    }

    public void mouseClicked(MouseEvent e) { }
    public void mouseReleased(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) { }
    public void mouseExited(MouseEvent e) { }
}

最初の import java.awt.* は,Java の AWT(Abstract Window Toolkit)をインポート(輸入)する,ということです。

次の import java.awt.event.* は,Java の AWT のイベント(マウス押し下げなど)関係のためのものです。

Java のプログラムは,一つまたは複数のクラス(class)から成ります。 上のプログラムは,たった一つのクラスから成ります。 クラスには名前を付けなければなりません。 ここでは Lesson2 というクラス名にしました。 クラス名は大文字で始める習慣になっています。

このクラス Lesson2 は,誰にでも使用を許可します(public)。

また,このクラス Lesson2 は,Java 開発キットに付属している java.applet.Applet というクラスを拡張(extend)したものです。 これは,Lesson2 というクラスで定義されていない命令などは,java.applet.Applet というクラスで定義されているものをそのまま使うという意味です。 アプレット(WWW ブラウザから実行する Java 言語のプログラム)は必ず java.applet.Applet または javax.swing.JAppletextend したものにしなければなりません。

次の implements MouseListener は,このアプレットがマウスの状態を調べるという宣言です。

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

このクラスを WWW ブラウザで実行したとき,最初にこの中の init() の部分が実行されます。 この init() は,setForeground(Color.yellow) つまり描く色を黄色に設定し,addMouseListener(this) つまりマウスを見張るための仕組みを取りつけます。

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

mousePressed() は,アプレットの中でマウスのボタンを押したときに呼び出されます。 ここではマウスの座標を保存し,repaint() を実行しています。

マウスを調べる仕組みは次のものがあります。

mousePressed()
マウスを押す
mouseClicked()
マウスを押して離す
mouseReleased()
マウスを離す
mouseEntered()
マウスが枠内にはいる
mouseExited()
マウスが枠から出る

paint() と update()

アプレットが repaint() という命令を実行すると,ブラウザがそのアプレットの paint() を呼び出すと言いましたが,正確に言えば,repaint() はアプレットの update() という命令を呼び出すのです。 デフォルトの update() の定義は次のようになっています。

    public void update(Graphics g) {
        g.setColor(getBackground());     // 背景色を得る
        g.fillRect(0, 0, width, height); // それで塗りつぶす
        g.setColor(getForeground());     // 前景色を得る
        paint(g);                        // paint(g) を呼び出す
    }

つまり,アプレット全体を背景色で塗りつぶしてから,paint(g) を呼び出しています。

Applet クラスの親は Panel クラス,Panel の親は ContainerContainer の親は Component です。 update()Component クラスで定義されています。

さきほどのプログラムに

    public void update(Graphics g) {
        paint(g);
    }

という3行を挿入すると,次のようになります。 つついてみてください。

これは,もともとある update() の定義が,この新しい定義で置き換えられたからです。


奥村晴彦

Last modified: 2005-12-29 10:53:19