[ ホーム | 本の感想 | 好きな作家 | イラスト展示 | Perlは便利 | Javaプログラミング ]

8. Javaアプレット作成

Javaアプレットの作成です。まずはサンプル的なものでアプレットのプログラミングを学ぼうと思います。プログラムを見る前に、概要を示します。

アプレットを作成するためには、作成する自分のクラスを既に存在する Appletクラスのサブクラスにします。クラスの宣言に extends Applet を付けるとクラスは Appletクラスのサブクラスになります。アプレットはブラウザで実行されるので、mainメソッドは必要ではありません。Appletクラスに既にアプレットの基本となるメソッドが存在しているので、どのメソッドがどの場面で働くかを理解して、その内容を変更してプログラムします。

それでは実際のプログラムと HTMLファイル、そして実行結果を見てみます。

Test100.java(説明用に行番号を付けました)
  1:import java.applet.Applet;
  2:import java.awt.*;
  3:
  4:public class Test100 extends Applet {
  5:	public void paint(Graphics g) {
  6:		g.setColor(Color.red);
  7:		g.drawLine(5,5, 5,95);
  8:		g.drawString("Javaアプレット", 20, 20);
  9:	}
 10:}



名前は何でもいいけど、一応 Test100.html

<HTML>
<HEAD><TITLE>Test100</TITLE></HEAD>
<BODY>
<APPLET CODE="Test100.class" WIDTH="300" HEIGHT="100">
</APPLET>
</BODY>
</HTML>

実行結果

エディタで Java のソースファイルを作成して、コンパイルします。行番号(1:, 2: …)はいりません。実行は、アプレットなので HTMLファイルを作って、それを AppletViewer かブラウザで読み込んで実行します。それでは、プログラムを見ていきます。
  1:import java.applet.Applet;
  2:import java.awt.*;
1,2行目の import文はプログラムで使ったメソッドなどが、どのクラスのものかを示しています。 1行目 java.applet.Applet が Appletクラスを直接示しているのに対して、2行目 java.awt.*java.awt に属する全てのクラスを示しています。実際には、このアプレットでは java.awt.Graphicsクラスしか使っていないので、
  2:import java.awt.Graphics;
としてもいいです。

  4:public class Test100 extends Applet {

 10:}
4行目で全体の新しいクラス Test100 を宣言しています。4行目から 10行目までが Test100クラスとなります。 外部から呼び出せるように public なクラスとして宣言しています。また、アプレットなので extends Applet として Appletクラスのサブクラスにしています。これを Appletクラスを継承すると言うようです。この Applet は、実際には java.applet.Applet ですが 1行目の import文があるので java.applet.Applet と書かなくて良いのです。
さて、ここで JDK をインストールしたディレクトリの docs\ja\index.html の [Java プラットフォーム Core API] を見て下さい。「5.JDK のインストール」でおすすめに書いてある設定していれば、ブラウザから簡単に表示出来ます。パッケージの [java.applet] の Class Index の [Applet]を表示すると次の図が見えます。
java.lang.Object
   |
   +----java.awt.Component
           |
           +----java.awt.Container
                   |
                   +----java.awt.Panel
                           |
                           +----java.applet.Applet
これは、Applet は Panel を継承して、その Panel は Container を継承して、その Container は …(以下略)Objectを継承している事を示します。作成中の Test100 は、Applet を継承しているので、ここに表示されたクラスを全て継承しています。

アプレットでは、アプリケーションの様に文字を表示するメソッドを呼び出して、文字を表示するという風に単純にはいきません。既にAppletクラスに存在するメソッドを変更して自分のアプレットにしていきます。ここで、基本的なアプレットがどんなメソッドを利用して動いているかを見ていきます。括弧の中は[Java プラットフォーム Core API]のどこに説明が書かれているかを示しています。これらのメソッドはクラスを継承した Appletクラスのメソッドであり、Appletクラスを継承した Test100クラス のメソッドでもあります。
init(java.applet.Applet.init)
ブラウザによって最初に呼び出されます。変数の初期化をします。そのままだと何もやっていません。
start(java.applet.Applet.start)
init の後と、アプレットの HTML 文が表示されるごとに呼び出されます。何もしていません。
stop(java.applet.Applet.stop)
ブラウザがアプレットを含む HTML 文を終了するとき呼び出されます。何もしていません。
destroy(java.applet.Applet.destroy)
アプレットがメモリから完全に除去される必要があるときだけ呼ばれます。何もしていません。
paint(java.awt.Component.paint)
最初の表示と、ウィンドウが重なって隠されていた表示の修復に呼ばれます。何もしていません。
update(java.awt.Component.update)
画面をデフォルトの色でクリアして、paint を呼びます。
repaint(java.awt.Component.repaint)
update を呼び出します。
この内容は解説書などからは得る事が出来ますが、JDK のドキュメントだけでは、分からない内容だと思います。
サンプルを見ながら、JDK API リファレンスの各クラスの説明を読めばなんとか分かるかも知れません。良い解説書を手に入れるのが一番楽ですが、説明がピンとこない場合はソースから確認する手もあるようです。(1999/2追加)

これらのメソッドのどこかで画面にラインと文字を表示します。表示と表示の修復をするために呼ばれる paint が一番むいているようです。解説書やその他のプログラム例を見ても paint で行なうようです。paint は何も書かないと Test100がクラスを継承しているので、java.awt.Component.paint の何もしない paint が呼ばれます。そこで、paint の内容を新たに定義します。これをオーバーライドというようです。これによって前の paint がなくなってしまう訳ではありません。paint の場合は、もともと何もしていないので意味はないでしょうが、前の paint を呼び出す方法もあります。

paintメソッドの記述に間違いがありました。paintメソッドはjava.awt.Componentに説明があり、何もしていませんとなっていますが、Componentクラスを継承しているContainerクラスでpaintメソッドをオーバーライドしています。たぶんJDK1.1で変更された部分で、このpaintメソッドはLightweightコンポーネントをサポートするための処理が書かれているようです。ただ、Lightweightコンポーネントを使わない場合は特に意識する必要はないようです。(1999/2改正)

[Java プラットフォーム Core API] の [java.awt] の [Component] の [paint] を表示すると public void paint(Graphics g) とその説明が出ています。paint はこの型で定義する必要があります。ただし Graphics g の g の部分は変えても大丈夫そうな気がします。public は外部からの呼び出し可能を意味し、void は paint が終了時に何も返さない事を表しています。何かを返す時は、ここが int など返値の型が書かれ、メソッドの終了に return 返値; と書く事になります。( )内のGraphics g は 呼び出された時に、Graphicsクラスの実体を g という変数に受け取り、paint の中で使う事を表しています。クラスはそのままでは実体がないので、クラスを呼び出す事でクラスに実体を持たせます。これをインスタンスを生成するというようです。インスタンスはクラス名の型(Graphics)で定義された変数(g)に格納します。

setColor、drawLine、drawStringメソッドそれぞれを調べてみます。[Java プラットフォーム Core API] の [java.awt] の [Graphics]を見ると Graphicsクラスは画面に図形や文字を描くための機能と画面そのものだと分かります。画面に図形や文字を描くには、画面と機能に実体を持たせなければならないのですが、ここではそれが見えないところで行われて paint に渡されます。さて、それでは、メソッド paint の中を見ていきましょう。
  5:	public void paint(Graphics g) {
  6:		g.setColor(Color.red);
  7:		g.drawLine(5,5, 5,95);
  8:		g.drawString("Javaアプレット", 20, 20);
  9:	}
6,7,8行の g. は渡された Graphicsクラスのインスタンスを表しています。g. が頭につくという事は、setColor、drawLine、drawString が Graphicsクラスのメソッドだという事です。[Java プラットフォーム Core API] の [java.awt] の [Graphics] でそれぞれの機能を見てみましょう。
setColor(Color)
現在の色を指定された色に設定する。
drawLine(int, int, int, int)
座標 (x1,y1) と座標 (x2,y2) との間に現在の色を使って線を描く。
drawString(String, int, int)
現在のフォントと色を使い指定された String を描く。

(この3つとも abstract が宣言されているので、私の少ない知識からすると、サブクラスに実装して、インスタンスを生成しなければ使えないのではと思うのですが…。どうなっているの良く分かりません。使えるという事は、どこかに実装されているのだから、それは Javaインタプリタに組み込まれているのかも知れません。こういった事は何を読むと分かるのでしょうか。)
Javaの文法の説明を見ると、abstractの宣言のあるメソッドは実装を提供していないので、サブクラスでこのメソッドを実装する必要があります。となっていますが、JDK API リファレンスの中でメソッドにabstractが付いているのは、サブクラスでメソッドを実装しなさいという意味ではないようです。インターフェースのメソッド以外は、別のところで実装済と考えて良いようです。(1999/2追加)

setColor は Color をパラメータで渡す、何も返さないメソッドです。Color は、java.awt.Color クラスです。[Java プラットフォーム Core API] の [java.awt] の [Color] を見ると、コンストラクタのところに、Color に3つの呼び出し方が書いてあります。(0.0 - 1.0) の範囲の3つの float型数値を指定する方法。int型の数値1つをビットで区切って指定する方法。(0 - 255) の範囲の3つの int型数値を指定する方法です。
また、フィールドを見ると、black や blueなど色の名前が定義されているのが分かります。各色は、public static final Color black というように、それぞれの名前の Color型の定数として定義されています。ソースを見るとこの定数は Color型の3つの int型の数値を格納しているので、この定数を使った指定も可能です。6行目の g.setColor(Color.red) は、Graphics クラスの実体 g に対して、色を指定するメソッドで、Colorクラスの定数 red を指定しています。赤いペンを手に持った状態です。

drawLine は線の開始位置と終了位置の座標を表す4つの int型の数値をパラメータにして、現在の色を使って線を描きます。やはり何も返しません。g.drawLine(5,5, 5,95) は、(5,5) から (5,95) まで、赤い線を引きます。縦の線になります。

drawString は描かれる文字列と、文字列の先頭文字の左下の座標をパラメータにして、文字列を表示します。文字列は String型の変数ですが、直接文字列を指定する事も出来るようです。setColor の所でやったような方法で調べられると思いますが、いろいろな例題でもそうしているのでいいとします。String は java.lang.Stringクラスですが、この java.langパッケージは唯一 import文を省略できるパッケージです。
g.drawString("Javaアプレット", 20, 20) は、"Javaアプレット" という文字列を赤で表示します。

以上でプログラムは終わりましたが、アプレットでは実行に、 HTMLファイルが必要になります。最低限の HTMLファイルは上にあるように、
<HTML>
<HEAD><TITLE>Test100</TITLE></HEAD>
<BODY>
<APPLET CODE="Test100.class" WIDTH="300" HEIGHT="100">
</APPLET>
</BODY>
</HTML>
となります。この内、次の2行がアプレットに関係しています。
<APPLET CODE="Test100.class" WIDTH="300" HEIGHT="100">
</APPLET>
<APPLET>タグの中がアプレットに対する指定になります。CODE= にアプレットをコンパイルした .classファイル名を、WIDTH= にアプレットの幅、HEIGHT= に高さを指定します。パラメータを受け取るアプレットでは<APPLET>タグと、</APPLET>タグの間に<PARAM>タグが入ります。


[ ホーム | 本の感想 | 好きな作家 | イラスト展示 | Perlは便利 | Javaプログラミング ]
間違いなどお気付きの事がありましたら hirose97@cg.netlaputa.ne.jp までメールを下さい。
ご感想もお待ちしています。なお、リンクは自由ですが出来ればお知らせ下さい。