アプレットは 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.Frame の show() メソッドは,窓を作り,アプレットの 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
クラスを使って,ウィンドウの監視をさせています。
ウィンドウの状態が変わると次のメソッドが呼び出されます。
windowOpened(WindowEvent e) …… 開いたwindowClosing(WindowEvent e) …… 閉じる操作をしたwindowClosed(WindowEvent e) …… 実際に閉じたwindowIconified(WindowEvent e) …… 最小化されたwindowDeiconified(WindowEvent e) …… 最小化の状態から元に戻されたwindowActivated(WindowEvent e) …… 窓が活性化したwindowDeactivated(WindowEvent e) …… 窓が不活性化したこれを同じディレクトリで別途コンパイルしておきます。
これなら,本体側のファイル 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 であるとします。
C:\j2sdk1.4.0\bin\java Foo と入れるC:\home を入れるこれでスタートボタンから直接起動できるようになりました。 上の手順でエクスプローラが現れたところで,エクスプローラ中のアイコンを右ボタンでデスクトップに移動・コピーすることもできます。
授業中に練習で作ったアイコンは,授業が終わるまでに消しておきましょう。 アイコンを消すには,先ほどと同様にしてエクスプローラでアイコンを探し,そのアイコンをごみ箱にドラッグします。 デスクトップに作ったアイコンも同様にごみ箱にドラッグします。
Last modified: 2005-12-29 11:04:04