Applet開発の実例

では、実際に Java言語で Appletを開発してみましょう。


次に示すプログラムを見てください。 これ以上簡単な Applet のプログラムはないでしょう。 (たった2行しかありません。)


import browser.Applet;

class Separater extends Applet { }

2行目が新しいクラスの作成を行っている部分です。 class Separater で、Separaterという名前の新しいクラスを 作ることを意味します。 新しいクラスはほとんどの場合既に存在するクラスを基にして作ります。 ここでは、すべてのApplet の基になるAppletクラスを 基にするという意味で、extends Appletと指定しています。
また、この例のようにプログラムの外部から別のクラスに関する情報を 取り込むには、 プログラムの先頭で importという命令を行うことになっています。 1行目がそうです。 browser.Applet となっているのは、 Appletクラスが browserパッケージに含まれているからです。 パッケージの中のクラスのファイルは、ディレクトリの階層で管理されています。 . がディレクトリの区切りに相当します。

さて、普通は { } の中に、 新しいクラスとしてどんな機能を追加したいかを複数行にわたって書きます。 上のサンプルが簡単なのも当たり前で、 実は何も追加する内容が存在しませんね。 Appletクラスをそのまま別の新しい名前に登録し直しているだけです。 無意味なことを行ったように見えるかもしれません。 しかし、上のプログラムはちゃんとコンパイルでき、 しかも HTML の中で十分役に立つアプレットになるのです!
その理由は、Appletクラス自身が既に多くの機能を持つ 部品として用意されているからです。 プログラムを作る皆さんの負担は最小限ですむようになっています。 (ただし、Appletクラスがどんな能力を持っているかは 覚えなければなりません。)

ここまで出てきた、重要なキーワードをまとめておきましょう。

次のサンプル・プログラムを見てみましょう。


import browser.Applet;
import awt.Graphics;

class Space extends Applet {

      public  void  paint( Graphics g ) {
      }
}

ほんの少しだけプログラムらしくなりました。 まず2行目で新しいクラスの情報を取り込んでいますね。 この Graphicsクラスは、図形や文字を表示するために存在します。 また、awtパッケージに含まれるクラスのようです。
今度の新しいクラスはSpaceという名前です。Appletクラスを 基にするのは変わりありません。
今度はクラスに新たに追加するものがあります。 新しいクラスには、通常のデータはもちろん、そのクラスのデータを操作するための 関数も追加することができます。 ここでは paint という名前の関数を追加しました。 (ただし、その中身はありません。) 関数の書き方のルールは C言語とほぼ同じです。ただし、 先頭の public という言葉が見慣れないものです。 これは、関数をクラスの外部にも公開するという意味です。 (これとは違ってクラスの内部だけに隠すような宣言もできるのですが、 とりあえずその話は置いておきます。)

さて、上の新しいクラスを作った意味が何かあるのでしょうか? 何もしない関数を追加しただけですから、単に同じアプレットを別の名前で 無駄に生産しただけのように思えます。 ところがこの Spaceクラスは、 Separeterクラスと微妙に違う 表示のされ方をします!
なぜでしょうか?理由はAppletクラスについての知識がないとわかりません。 実は Appletクラスには元々 paint という名前の関数が 存在しているのです。 Spaceクラスは、何もしていないようですが、 その基の関数を書き換えたことになったわけです。

もう少しプログラムらしい例を見てみましょう。


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 );
       }
}

今度はクラスの名前は Hellow で、 関数が2個あり、しかも内容がちゃんとあります。
クラスに追加するデータや関数は、全く独自に定義される場合もあれば、 既に存在する特別な名前のものを書き換える場合もあります。 注意して欲しいのは、プログラムだけを形式的に見ただけでは、 その区別はつかないということです!
オブジェクト指向のプログラミングでは、 「利用したいクラスの説明書をよく読むこと」が重要だと考えてください。 上の例では、init()paint()Applet クラスで 特別な意味を持つ関数です。 init()はアプレットが生成された時に呼び出され、その初期設定を 行います。 paint()はアプレットが画面に表示される時に自動的に呼び出される関数です。 init()の内部で呼び出されている resize()Appletクラスの内部で定義されている関数で、 名前のとおりアプレット自身のサイズを変更します。 上のプログラムでは突然出現したように見え、関数の定義がどこにも見当たらない のですが、実はちゃんとこのクラスの中にあるデータなのです。 ですからエラーになったりましません。

アプレットの内部に図形を描くための関数は、Graphicsクラスに 用意されています。 上で説明したように、オブジェクト指向言語である Java言語では、 関数は全てクラスの内部に存在します。 もし、自分自身の内部にない関数を利用するならば、 その関数が含まれる別のクラスのオブジェクトが必要になります。 そのため、paint()では Graphicsクラスのオブジェクト g を用意しています。
オブジェクトの内部のデータや関数にアクセスするには、記号 . を使います。 これは C言語の構造体のルールと同じです。

Java言語自体についても、Appletクラスについても、 まだまだ説明しなければならない点が山ほどあります。 しかし、きりがないので、最後に1つだけ重要な Appletの機能を紹介します。 それは、HTML の中で指定されたデータを受け取るという機能です。
上のHellowクラスは、いつも同じ文字列しか表示しないので あまり実用的ではありません。 このアプレットを実際に使う人が、HTML の中でメッセージの内容を指定できる ようにすべきでしょう。

この要求は、当然必要となる機能なので Appletクラスに 組み込まれています。


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 );
      }
}

かなり複雑になってきましたが、ポイントは getAttribute() という 関数です。この関数は、(もちろん Appletクラスにあらかじめ 用意された関数で)HTML のファイルで指定されたデータの値を 受け取ります。受け取るデータは Stringという文字列を扱うための クラスのデータです。
HTML の側では次のようにして Messageクラスの アプレットにデータを渡すことが可能になります。


<APP CLASS="MESSAGE" VALUE="This is a pen.">

VALUE= の指定が省略された場合のために、 Java言語のプログラムの側でデフォルト値を用意する方がいいでしょう。
なお、null は Java言語独特のキーワードで、 どんなクラスのデータに対しても代入することができます。 C言語の NULL のように 0 という数値を表すのではなく、 「オブジェクトがない状態」を表す抽象的なデータです。