Applet開発の実例
次に示すプログラムを見てください。
これ以上簡単な Applet のプログラムはないでしょう。
(たった2行しかありません。)
import browser.Applet;
class Separater extends Applet { }
さて、普通は { と } の中に、
新しいクラスとしてどんな機能を追加したいかを複数行にわたって書きます。
上のサンプルが簡単なのも当たり前で、
実は何も追加する内容が存在しませんね。
Appletクラスをそのまま別の新しい名前に登録し直しているだけです。
無意味なことを行ったように見えるかもしれません。
しかし、上のプログラムはちゃんとコンパイルでき、
しかも HTML の中で十分役に立つアプレットになるのです!
ここまで出てきた、重要なキーワードをまとめておきましょう。
さて、上の新しいクラスを作った意味が何かあるのでしょうか?
何もしない関数を追加しただけですから、単に同じアプレットを別の名前で
無駄に生産しただけのように思えます。
ところがこの Spaceクラスは、 Separeterクラスと微妙に違う
表示のされ方をします!
アプレットの内部に図形を描くための関数は、Graphicsクラスに
用意されています。
上で説明したように、オブジェクト指向言語である Java言語では、
関数は全てクラスの内部に存在します。
もし、自分自身の内部にない関数を利用するならば、
その関数が含まれる別のクラスのオブジェクトが必要になります。
そのため、paint()では Graphicsクラスのオブジェクト g
を用意しています。
この要求は、当然必要となる機能なので Appletクラスに
組み込まれています。
その理由は、Appletクラス自身が既に多くの機能を持つ
部品として用意されているからです。
プログラムを作る皆さんの負担は最小限ですむようになっています。
(ただし、Appletクラスがどんな能力を持っているかは
覚えなければなりません。)
次のサンプル・プログラムを見てみましょう。
ほんの少しだけプログラムらしくなりました。
まず2行目で新しいクラスの情報を取り込んでいますね。
この Graphicsクラスは、図形や文字を表示するために存在します。
また、awtパッケージに含まれるクラスのようです。
import browser.Applet;
import awt.Graphics;
class Space extends Applet {
public void paint( Graphics g ) {
}
}
今度の新しいクラスはSpaceという名前です。Appletクラスを
基にするのは変わりありません。
今度はクラスに新たに追加するものがあります。
新しいクラスには、通常のデータはもちろん、そのクラスのデータを操作するための
関数も追加することができます。
ここでは paint という名前の関数を追加しました。
(ただし、その中身はありません。)
関数の書き方のルールは C言語とほぼ同じです。ただし、
先頭の public という言葉が見慣れないものです。
これは、関数をクラスの外部にも公開するという意味です。
(これとは違ってクラスの内部だけに隠すような宣言もできるのですが、
とりあえずその話は置いておきます。)
なぜでしょうか?理由はAppletクラスについての知識がないとわかりません。
実は Appletクラスには元々 paint という名前の関数が
存在しているのです。 Spaceクラスは、何もしていないようですが、
その基の関数を書き換えたことになったわけです。
もう少しプログラムらしい例を見てみましょう。
今度はクラスの名前は Hellow で、
関数が2個あり、しかも内容がちゃんとあります。
import browser.Applet;
import awt.Graphics;
class Hellow extends Applet {
public void init() {
resize( 60, 30 );
}
public void paint( Graphics g ) {
g.paint3DRect( 0, 0, 60, 30,
false, true );
g.drawString( "Hellow!", 5, 20 );
}
}
クラスに追加するデータや関数は、全く独自に定義される場合もあれば、
既に存在する特別な名前のものを書き換える場合もあります。
注意して欲しいのは、プログラムだけを形式的に見ただけでは、
その区別はつかないということです!
オブジェクト指向のプログラミングでは、
「利用したいクラスの説明書をよく読むこと」が重要だと考えてください。
上の例では、init() も paint() も Applet クラスで
特別な意味を持つ関数です。
init()はアプレットが生成された時に呼び出され、その初期設定を
行います。
paint()はアプレットが画面に表示される時に自動的に呼び出される関数です。
init()の内部で呼び出されている resize() も
Appletクラスの内部で定義されている関数で、
名前のとおりアプレット自身のサイズを変更します。
上のプログラムでは突然出現したように見え、関数の定義がどこにも見当たらない
のですが、実はちゃんとこのクラスの中にあるデータなのです。
ですからエラーになったりましません。
オブジェクトの内部のデータや関数にアクセスするには、記号 . を使います。
これは C言語の構造体のルールと同じです。
Java言語自体についても、Appletクラスについても、
まだまだ説明しなければならない点が山ほどあります。
しかし、きりがないので、最後に1つだけ重要な Appletの機能を紹介します。
それは、HTML の中で指定されたデータを受け取るという機能です。
上のHellowクラスは、いつも同じ文字列しか表示しないので
あまり実用的ではありません。
このアプレットを実際に使う人が、HTML の中でメッセージの内容を指定できる
ようにすべきでしょう。
かなり複雑になってきましたが、ポイントは getAttribute() という
関数です。この関数は、(もちろん Appletクラスにあらかじめ
用意された関数で)HTML のファイルで指定されたデータの値を
受け取ります。受け取るデータは Stringという文字列を扱うための
クラスのデータです。
import browser.Applet;
import awt.Graphics;
class Message extends Applet {
int width;
String message = null;
public void init() {
message = getAttribute( "value" );
if( message == null )
message = "Welcome to Wakkanai!";
width = font.stringWidth(message)+10;
resize( width, 30 );
}
public void paint( Graphics g ) {
g.paint3DRect( 0, 0, width, 30,
false, true );
g.drawString( message, 5, 20 );
}
}
HTML の側では次のようにして Messageクラスの
アプレットにデータを渡すことが可能になります。
VALUE= の指定が省略された場合のために、
Java言語のプログラムの側でデフォルト値を用意する方がいいでしょう。
<APP CLASS="MESSAGE" VALUE="This is a pen.">
なお、null は Java言語独特のキーワードで、
どんなクラスのデータに対しても代入することができます。
C言語の NULL のように 0 という数値を表すのではなく、
「オブジェクトがない状態」を表す抽象的なデータです。