レッスン5

アプレットは HTML ファイルの中に埋め込まれたプログラムです。

レッスン1で次のアプレットを作りました。

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

public class Foo extends Applet {
    public void paint(Graphics g) {
        Random a = new Random();
        for (int i = 0; i < 100; i++) {
            g.setColor(new Color(a.nextInt()));
            int x = (int)(300 * a.nextDouble());
            int y = (int)(100 * a.nextDouble());
            int r = (int)(40 * a.nextDouble()) + 10;
            g.fillOval(x - r, y - r, 2 * r, 2 * r);
        }
    }
}

これを単独のアプリケーションにするには,次のように手直しします。

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

public class Foo extends Applet {
    public void paint(Graphics g) {
        Random a = new Random();
        for (int i = 0; i < 100; i++) {
            g.setColor(new Color(a.nextInt()));
            int x = (int)(300 * a.nextDouble());
            int y = (int)(100 * a.nextDouble());
            int r = (int)(40 * a.nextDouble()) + 10;
            g.fillOval(x - r, y - r, 2 * r, 2 * r);
        }
    }
    public static void main(String args[]) {
        Frame frame = new Frame("Foo"); // フレームを作る
        Foo foo = new Foo();      // アプレットを作る
        frame.add("Center", foo); // アプレットをフレームに加える
        frame.pack();             // レイアウトを整える
        foo.init();               // アプレットを初期化
        frame.setSize(300, 100);  // フレームのサイズを定める
        frame.show();             // フレームを画面に出す
        foo.start();              // アプレットを開始
    }
}

これなら,アプレットとしても使えますし,アプリケーションとしても使えます。 アプレットとして使う場合は main() は使われません。

main() では,まず新しいフレーム(java.awt.Frame)のインスタンスと,自分自身(Foo)のインスタンスを作ります。 そして,自分自身を初期化した後,フレームの中央に配置します。 フレームの大きさを横300ドット,縦100ドットに調整し,フレームを画面に出現させます。

java.awt.Frameshow() メソッドは,窓を作り,アプレットの paint() メソッドで描画した後,呼び出し側(ここでは main() メソッド)に処理を戻します。 しかし,その後もバックグラウンドで窓を監視し, 再描画の必要ができれば再び paint() を呼び出します。

このフレームはWindowsの窓の[×]ボタンを押しても閉じません。 終了するためには,「java Foo」と打ち込んだMS-DOSプロンプトを前面に出して,Ctrl + C を入力します。

[×]ボタンでも終了するようにするために,Frame クラスを拡張した MyFrame クラスを作ってみました。

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

class MyFrame extends Frame implements WindowListener {
    Applet myApplet;
    MyFrame(String title, Applet applet, int width, int height) {
        super(title);
        addWindowListener(this);
        myApplet = applet;
        add("Center", myApplet);
        pack();
        myApplet.init();
        setSize(width, height);
        show();
        myApplet.start();
    }
    public void windowClosing(WindowEvent e) {
        myApplet.stop();
        myApplet.destroy();
        dispose();
        System.exit(0);
    }
    public void windowActivated(WindowEvent e) { }
    public void windowClosed(WindowEvent e) { }
    public void windowDeactivated(WindowEvent e) { }
    public void windowDeiconified(WindowEvent e) { }
    public void windowIconified(WindowEvent e) { }
    public void windowOpened(WindowEvent e) { }
}

これは java.awt.event.WindowListener クラスを使って,ウィンドウの監視をさせています。 ウィンドウの状態が変わると次のメソッドが呼び出されます。

これを同じディレクトリで別途コンパイルしておきます。

これなら,本体側のファイル Foo.java

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

public class Foo extends Applet {
    public void paint(Graphics g) {
        Random a = new Random();
        for (int i = 0; i < 100; i++) {
            g.setColor(new Color(a.nextInt()));
            int x = (int)(300 * a.nextDouble());
            int y = (int)(100 * a.nextDouble());
            int r = (int)(40 * a.nextDouble()) + 10;
            g.fillOval(x - r, y - r, 2 * r, 2 * r);
        }
    }
    public static void main(String args[]) {
        new MyFrame("Foo", new Foo(), 300, 100);
    }
}

ですみます。

この MyFrame クラスを使っても,アプレットで使える機能がすべて使えるようになるわけではありません。 たとえば getDocumentBase() などを呼び出すとエラーになります。 これらを完全に使えるようにすれば,アプレットビューアやブラウザになってしまいます。 そこまでする必要はないでしょう。

ちなみに,「内部クラス」(inner class)という機能を使えば,MyFrame.java は次のように書くことができます。

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

class MyFrame extends Frame {
    Applet myApplet;
    MyFrame(String title, Applet applet, int width, int height) {
        super(title);
        myApplet = applet;
        add("Center", myApplet);
        pack();
        myApplet.init();
        setSize(width, height);
        show();
        myApplet.start();
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                myApplet.stop();
                myApplet.destroy();
                dispose();
                System.exit(0);
            }
        });
    }
}

つまり,クラスの中で別の無名のクラスを作り,その中で windowClosing() を定義します。 この無名のクラスは,コンパイルすると MyFrame$1.class のような名前のファイルになります。 ファイルが一つ増えるのが欠点ですが,こちらのほうがプログラムは簡単になります。

アプリケーションをアイコン登録するには

JavaのアプリケーションをWindowsのスタートメニューやデスクトップにアイコン登録するには,たとえば次のようにします(ほかの方法もあります)。 下の例では,Javaインタープリタは c:\j2sdk1.4.0\bin にあり, 実行したいクラスファイルは c:\home\Foo.class であるとします。

  1. Windowsのタスクバー([スタート]ボタンのある帯)上の,何もないところを右クリック
  2. 「[スタート]メニューの設定」タブを選ぶ
  3. [追加]を押す
  4. コマンドラインとして C:\j2sdk1.4.0\bin\java Foo と入れる
  5. [次へ]を押す
  6. ショートカットを保存するフォルダを選ぶ(新しいフォルダを作ってもいい)
  7. [次へ]を押す
  8. ショートカットの名前として,適当な名前を入れる
  9. [完了]を押す
  10. [詳細]を押す
  11. エクスプローラが現れるので,今登録したものを探す
  12. 右ボタンでクリックし,プロパティを選ぶ
  13. ショートカットタブを選ぶ
  14. 作業フォルダとしてクラスファイルのあるディレクトリ C:\home を入れる
  15. 実行時の大きさを「最小化」にする
  16. [アイコンの変更]ボタンで適当なアイコンを選ぶ
  17. [OK]を押す

これでスタートボタンから直接起動できるようになりました。 上の手順でエクスプローラが現れたところで,エクスプローラ中のアイコンを右ボタンでデスクトップに移動・コピーすることもできます。

授業中に練習で作ったアイコンは,授業が終わるまでに消しておきましょう。 アイコンを消すには,先ほどと同様にしてエクスプローラでアイコンを探し,そのアイコンをごみ箱にドラッグします。 デスクトップに作ったアイコンも同様にごみ箱にドラッグします。


奥村晴彦

Last modified: 2005-12-29 11:04:04