S-JIS[2003-07-06/2008-12-20] 変更履歴

Javaアプレット

Javaアプレットは、htmlファイル上(ブラウザー内)で実行して表示する為の形式。

javacでコンパイルし、アプレットを使用しているhtmlファイルを表示することで実行する。通常のブラウザーの他、appletviewerでhtmlファイルを指定することによっても表示できる。


コーディング・コンパイル方法

アプレットは、java.applet.Appletから派生させたクラスを作り、そのメソッドをオーバーライドする。
したがってコーディング方法やコンパイル方法は通常のJavaアプリケーションと同じだが、実行はAppletクラスに存在するメソッドが呼ばれる形な為、自分でmain()メソッドをコーディングする必要は無い。

Appletを継承しなかった場合は実行時に以下のような例外が出力される[2008-12-20]

java.lang.ClassCastException: Sample cannot be cast to java.applet.Applet
        at sun.applet.AppletPanel.createApplet(AppletPanel.java:778)
        at sun.applet.AppletPanel.runLoader(AppletPanel.java:707)
        at sun.applet.AppletPanel.run(AppletPanel.java:361)
        at java.lang.Thread.run(Thread.java:619)

実行方法

ほにゃらら.classを実行するHTMLのタグ

<APPLET CODE="ほにゃらら.class" WIDTH= HEIGHT=高さ>
	APPLETタグがサポートされていない場合のメッセージ
</APPLET>

どういう属性があるかについては、SunのAPPLETタグを参照。[2008-12-20]
code属性に実行したいクラスのファイル名を指定するが、「.class」は無くても動く(少なくともIEでは)。
でもSunのページのサンプルでは、「.class」が有ったり無かったりするんだよなー。

APPLETを使えないように設定されているブラウザーでは実行できない。
IEで設定を変える方法→Sunの従来のアプレットのインストール

IE限定ならOBJECTタグ、Mozilla限定ならEMBEDタグも使えるらしい。
→SunのAPPLET、OBJECT、およびEMBEDタグの使用
HTML4.01ではAPPLETタグよりOBJECTタグの方が推奨らしいが。SunのページだとOBJECTタグの方が古いように見えるし、OBJECTタグも各ブラウザーでまだ統一されていないっぽい。


アプレットビューア

APPLETタグを含んだHTMLファイルをブラウザーで開けばアプレットは実行される。[2008-12-20]

また、ブラウザーの代わりにアプレットビューアをコマンドプロンプトから起動することも出来る。

C:\applet> appletviewer -encoding MS932 applet.html

※appletviewerは、JDKをインストールすればjavac.exeと同じ場所に入っている。パスは通っているので、どこからでも実行できる。
※-encodingはhtmlファイル内に文字コードの指定が無い場合に付ける。

Eclipseでコーディングしている場合、HTMLファイルを書かなくても通常の実行(やデバッグ実行)でアプレット実行ツール(アプレットビューア)が起動するので、そちらで開発することも出来る。
(Appletを継承したクラスのところで「実行」→「Javaアプレット」でアプレットビューアが起動する)
(「実行の構成」で、アプレットの幅・高さやパラメーターを指定することも出来る)
(実際にはHTMLが生成されて動いている。アプレットビューアのメニューバーの「アプレット」→「タグ」で、どんなHTMLで実行されているか表示される)


デバッグ方法

アプレットビューアから実行している場合、例外が起きるとコンソールにスタックトレースが出力される。[2008-12-20]

Eclipseからデバッグ実行して起動したアプレットビューアであれば、Eclipse上のブレークポイントで停止させることが出来る。

ブラウザーから実行して上手く動作していない場合は、APPLETエリアに画像が正しく出ない(「X」みたいなアイコンだけ出る)。
この場合はAPPLETエリアを右クリックして「Javaコンソールを開く」で「Javaコンソール」ウィンドウが開く。例外が発生していれば、ここにスタックトレースが出る。


デフォルトパッケージのクラスのサンプル

最も基本的な例。[2008-12-20]

DefaultApplet.java

import java.applet.Applet;
import java.awt.Graphics;

public class DefaultApplet extends Applet {

	public void paint(Graphics g) {
		g.drawString("test!", 16, 16);
	}
}

これをコンパイルしたクラスを、このクラスを使いたいhtmlファイルと同じ場所に置く。
以下、WindowsでC:\appletに置いた場合の例。

C:\applet> dir /b
applet.html
DefaultApplet.class

applet.html

<applet alt="デフォルトパッケージのアプレット"
	code="DefaultApplet.class"
	width="256" height="256">
</applet>

これでapplet.htmlを実行する(ブラウザーで開く)と、「test!」が表示される(はず)。


別の場所にあるクラスのサンプル

htmlファイルと別の場所にあるアプレットを実行したい場合は、APPLETタグにcodebase属性を指定する。[2008-12-20]

C:\applet> dir /s/b
C:\applet\applet2.html
C:\applet\classes
C:\applet\classes\DefaultApplet.class

applet2.html

<applet alt="別に場所にあるアプレット"
	codebase="classes" code="DefaultApplet.class"
	width="256" height="256">
</applet>

codebaseはAPPLETタグのあるhtmlファイルからの相対パスで指定できる。なので「./classes」とか「..」も使える。
また、「http://」でURL(絶対パス)も指定できる。


パッケージ付きクラスのサンプル

パッケージ名付きのクラスを実行する場合は、code属性にパッケージを付ける。[2008-12-20]

PackageApplet.java

package jp.hishidama.sample.applet;

import java.applet.Applet;
import static java.awt.Color.*;
import java.awt.Graphics;

public class PackageApplet extends Applet {

	private static final long serialVersionUID = -6730248261351094041L;

	@Override
	public void paint(Graphics g) {
		g.setColor(BLUE);
		g.drawString("test!", 64, 32);
	}
}

※↑JDK1.5の文法で書いてみた。実行環境にJRE1.5以上が入っていれば問題なく動く。

C:\applet> dir /s/b /a-d
C:\applet\applet3.html
C:\applet\classes\jp\hishidama\sample\applet\PackageApplet.class

applet3.html

<applet alt="パッケージ名付きアプレット"
	codebase="classes"
	code="jp.hishidama.sample.applet.PackageApplet.class"
	width="256" height="256">
</applet>

jarファイルのサンプル

複数のクラス(や画像等のリソース)を1つのjarファイルにまとめれば、そこから実行することが出来る。[2008-12-20]

C:\applet> dir /s/b /a-d
C:\applet\applet4.html
C:\applet\jar\hmapplet.jar

C:\applet> jar tf jar\hmapplet.jar
META-INF/
META-INF/MANIFEST.MF
jp/
jp/hishidama/
jp/hishidama/sample/
jp/hishidama/sample/applet/
jp/hishidama/sample/applet/PackageApplet.class

applet4.html

<applet alt="jarファイル内アプレット"
	archive="jar/hmapplet.jar"
	code="jp.hishidama.sample.applet.PackageApplet"
	width="256" height="256">
</applet>

archive属性には(codebase属性と同様に)実行するhtmlファイルからの相対パスで指定する。
複数のjarファイルを指定したい場合は、archive属性にカンマ区切りで列挙する。

なお、jarファイルはAppletの継承クラス(とそのクラスが使用するクラス群)が入っていればよく、実行可能jarファイル形式である必要は無い。


パラメーターの指定・取得方法

HTML(APPLETタグ)毎に、アプレットに渡すデータを記述することが出来る。[2008-12-20]
アプレット内からはApplet#getParameter()でそのデータを取得できる。

applet.html:

<applet alt="パラメーター指定アプレット"
	code="ParamApplet.class"
	width="256" height="256">
    <param name="paramName" value="paramData">
</applet>

ParamApplet.java

import java.applet.Applet;
import java.awt.Graphics;

public class ParamApplet extends Applet {

	@Override
	public void paint(Graphics g) {
		String data = super.getParameter("paramName");
		g.drawString(data, 64, 32);
	}
}

なお、APPLETタグのwidth・height属性で指定された幅と高さは、Applet#getBounds()で取得可能。


関連リンク

参考書 参考にした本 [2004-03-16]
jphi 知人が作ったゲームだけど、アプレットがこんなに高速に動作するとは思わなかった! [2007-12-06]

技術メモへ戻る
メールの送信先:ひしだま