←前頁 | 次頁→ |
---|
その5(最初のアプレット)
アプレットとは、ブラウザ上でJAVAプログラムを動かすしかけです。
当然ブラウザがJAVA対応でないと動きませんし、ブラウザが対応している
JAVAのバージョンもまちまちです。現在JAVA2に対応したブラウザがないため
JAVA2の機能を使ったアプレットを動かすためには少し細工が必要です。
とりあえず今回の例題はIE、NSともバージョン4.0以上なら動くはずです。
つまらない例題ですが(動きのないアプレットならば画像を貼り付ければ十分)
最初なので我慢してください。
ロゴ表示をするアプレットです。
/** RDXアプレットプログラム 楕円の中にラデックスの文字を表示します HTML例↓ <applet code="RdxApplet.class" codebase="." width="320" height="120"> </applet> @author 服部建作 @version 1.0 1999/10/11 */ //アプレットを定義する為のパッケージ(必須) import java.applet.*; //描画関係のパッケージ import java.awt.*; public class RdxApplet extends Applet{ //定数宣言 static final String logo = "ラデックス"; //変数宣言 Font font; //フォント Color color = new Color(0xff0000); //RGB値で色を指定 //Appletの初期化処理(1度しか呼ばれない) public void init(){ //フォントサイズはアプッレト画面の大きさから計算 int fontpoint = getSize().height * 4 / 10; font = new Font("Serif", (Font.BOLD | Font.ITALIC), fontpoint); } //Appletの表示が開始された時ブラウザ-から呼ばれる public void start(){} //Appletが表示されなくなった時ブラウザ-から呼ばれる public void stop(){} //Appletを破棄する時にブラウザ-から呼ばれる public void destroy(){} //Appletが表示される時呼ばれる public void paint(Graphics g){ int startx = getSize().width / 10; //矩形領域開始X座標 int starty = getSize().height / 10; // Y座標 int height = getSize().height * 8 / 10; //高さ int width = getSize().width * 8 / 10; //幅 //下地用に薄灰色の楕円を描く g.setColor(Color.lightGray); g.fillOval(startx, starty, width, height); //4ピクセル幅の線を4つの楕円で描く g.setColor(color); //色を指定してから描く g.setFont(font); //フォントもここで指定 g.drawOval(startx, starty, width, height); g.drawOval(startx-1, starty-1, width+2, height+2); g.drawOval(startx-2, starty-2, width+4, height+4); g.drawOval(startx-3, starty-3, width+6, height+6); //楕円の中にテキスト描画 FontMetrics fmetrics = g.getFontMetrics(); //フォントサイズ int fontLength = fmetrics.stringWidth(logo); //文字列の幅 int fontHeight = fmetrics.getHeight(); //文字の高さ g.drawString( logo, (getSize().width - fontLength) / 2, (getSize().height - fontHeight) / 2 + fontHeight *3 / 4); } }アプレットの実行の仕方
- 以下のようなHTMLファイルを作成し、コンパイル結果であるRdxApplet.classをHTMLと 同じディレクトリにおいて、ブラウザで直接HTMLファイルを開きます。
<html><head></head> <body> <applet code="RdxApplet.class" codebase="." width="300" height="150"> </applet> </body> </html>- ブラウザがうまく行かない場合は、JDKのツール appletviewer.exe を使って表示できます。
appletviewer HTMLファイル名
但し、このツールは<applet>タグの部分しか実行しませんが、当然JAVA2に対応 しているので、JAVA2のアプレットの動作確認ができます。- <applet>タグのcodeはクラス名指定、codebaseはサブディレクトリー指定(WWWサーバー上で htmlと異なるディレクトリにアプレットプログラムを置いた時の相対パス指定、widthとheightは アプレットの表示領域の大きさを指定します。
- この例のようにコメントに<applet>タグを記述してあると、appletviewer RdxApplet.java でアプレットの動作を確認することができます。
アプレットについて
- アプレットはmain()メソッドを持ちません。ブラウザから呼出される アプレットのメソッドをコーディングします。
- アプレットの最初は、public class アプレット名 extends Applet です。
- extends キーワードは、既存のクラスからの継承を表現します。
- アプレットがオーバーライド(再定義)すべきメソッド(関数)は たくさんありますが、とりあえずは、init(),start(),stop(),destroy(),paint()の5つを 覚えておけばよいでしょう。
- その他のメソッドは、Appletクラスのものが使用されるので デフォルトの動作(たいていはなにもしない)でよければ、定義する必要はありまん。
(ここが、クラスの便利なところ)- init()では、1度しか行わない初期処理を記述します。(ボタンの配置、DB接続など)
- start()では、開始処理を行います。(タイマーの開始など)
(ブラウザは、アプレットが表示位置にくる度に start()を呼出します。- stop()では終了処理を記述します。(タイマー停止処理など)
(ブラウザは、アプレットがスクロールして画面外 になった時にstop()を呼出します。- destroy()は、終了処理を記述します。(DBの切断など)
(ブラウザはアプレット画面が終了するときに destroy()を呼出します。)- paint()は、描画処理を記述します。
(ブラウザは、最初に表示する時とか隠れていて前面に出てきた時にpaint()を 呼出します。)- ブラウザは、init()->{start()->{paint()}->stop()}->destroy()の順に 処理を呼出す約束になっています。({}は中身が複数回繰り返されることを示す)
- 実際は、もうひとつupdate()という重要なメソッドがあるが、こちらは デフォルトでは表示領域を消去してpaint()メソッドを呼ぶようになっているので 表示のちらつきが気にならない時は、デフォルトのままでよい。 (隠れていた画面が表に出た時には、update()が呼ばれる)
JAVA2のアプレットについて
- Java2では、Appletの代わりに JAppletをextendsします。
- Java2では、GUIのクラスが軽量&多機能化されており、ボタンとかフレームとか Java1.1のクラスに"J"を付けたものを使用した方が有利です。
- ただ、下記にあるように、HTMLを変えないと現行のブラウザでは、 JAppletは実行できません。
- もっとも<applet>タグ自体HTML4.0では廃止(互換性の為だけに 残されている)の方向なので、&object>タグを使ってJava2アプレットを ばりばり動かす日が来る(かもしれない)
Graphicsについて
- paint()メソッドでは、描画領域のクラスであるGraphicsオブジェクトが 渡されるので、Graphicsクラスのメソッドを使ってばりばり描いてやれば さほど難しくなく絵は書けます。
- 長方形 drawRect(x,y,width,height) 直線 drawLine(x1,y1,x2,y2) 円弧 drawArc(x,y,width,height,startAngle,arcAngle)...
Appletの描画領域
- アプレットの描画領域は、HTMLのタグの属性 width と heightで指定されます。 (単位はピクセル)
- HTMLのタグで指定されたサイズをとってくるメッソドが、getSize()です。
- getSize()はDemensionというオブジェクトを返します。Demensionオブジェクトは width と height のプロパティ(フィールド)を持ちます。
変数への代入について
- オブジェクト変数への代入は、通常 new を使います。
- newをつけると新たなメモリを確保してオブジェクトを作成します。
- newをつけないと、同じ参照データを持つ別名のような扱いになります。
- Javaでは、int,char,float,double,booleanといった単純な型以外は すべてクラスのオブジェクトと思ってよろしい。
- オブジェクトの初期値設定のしかた。
- 他のオブジェクト変数を代入する。 Color clr2 = color;
- コンストラクタで初期化する。 Color clr = new Color(0xffff00);
- そのオブジェクト型を返すメソッドを代入する Color clr = g.getColor();
変数への代入について
- オブジェクト変数への代入は、通常 new を使います。
- newをつけると新たなメモリを確保してオブジェクトを作成します。
- newをつけないと、同じ参照データを持つ別名のような扱いになります。
- Javaでは、int,char,float,double,booleanといった単純な型以外は すべてクラスのオブジェクトと思ってよろしい。
- オブジェクトの初期値設定のしかた。
- 他のオブジェクト変数を代入する。 Color clr2 = color;
- コンストラクタで初期化する。 Color clr = new Color(0xffff00);
- そのオブジェクト型を返すメソッドを代入する Color clr = g.getColor();
フォントについて
- どの実行環境でも使用できるフォントは、Dialog,DialogInput,Monospaced,Serif,SansSerif,Symbol の6つだけです。(Java1.2の場合)
- 本プログラム中では、なるべく真中に文字を表示しようと計算式を駆使しています。
- フォントには、ベースラインという概念があってSerifだと文字の高さの3/4の 位置にあるようです。(試行錯誤の結果ですので実行環境によっては違うかも)
JAVA2アプレットの実行:
←前頁 次頁→ オーバーライド:
- まず、JAVAプラグインなるものを入手しインストールします。
- JDK1.2以降のWindows版を通常インストールしてあれば、
JAVAプラグインもインストールされているので上記の操作は不要です。- JAVA2アプレットを埋め込んだhtmlファイルのappletタグを以下のように 変更します。
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "300" HEIGHT = "150" codebase="http://java.sun.com/products/plugin/1.2/jinstall-12-win32.cab#Version=1,2,0,0"> <PARAM NAME = CODE VALUE = "RdxApplet.class" > <PARAM NAME = CODEBASE VALUE = "." > <PARAM NAME="type" VALUE="application/x-java-applet;version=1.2"> <COMMENT> <EMBED type="application/x-java-applet;version=1.2" java_CODE = "RdxApplet.class" java_CODEBASE = "." WIDTH = "600" HEIGHT = "50" pluginspage="http://java.sun.com/products/plugin/1.2/plugin-install.html"><NOEMBED></COMMENT> このブラウザはAPPLETに未対応です。 </NOEMBED></EMBED> </OBJECT>詳しくは、 JAVAプラグインHTMLの仕様を見てください。継承:
- extends したクラスと同じメソッドを定義すること。
- クラス利用の利点のひとつ。既存のクラスの機能の一部だけを拡張できる。
- オーバーロードと同じ意味に使われることもある。
- オーバーロードは、本来は同じ名称のメソッドを複数定義すること。
- (やたらオーバーロードすると混乱する。最初はコンストラクタに 使うだけにしたほうがよい。)
- 大罵雷怒。ヤンキーのチーム名の1つ?
- extends したクラスのメソッドやフィールド(変数)を引き継ぐこと。
- extendsの元クラスでできる処理は、サブクラス(孫クラスでも)すべて 行うことができる。
- 例えば、親クラスがアプレットとして動作可能ならば、子クラスもアプレット として動作可能である。
- オーバーロードは、本来は同じ名称のメソッドを複数定義すること。
- (やたらオーバーロードすると混乱する。最初はコンストラクタに 使うだけにしたほうがよい。)
- inheritance(インヘリタンス:遺伝)と言いかえるとちょっと賢くなった気分?