S-JIS[2003-07-06/2008-12-20] 変更履歴
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]
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 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
<applet alt="別に場所にあるアプレット" codebase="classes" code="DefaultApplet.class" width="256" height="256"> </applet>
codebaseはAPPLETタグのあるhtmlファイルからの相対パスで指定できる。なので「./classes
」とか「..
」も使える。
また、「http://」でURL(絶対パス)も指定できる。
パッケージ名付きのクラスを実行する場合は、code属性にパッケージを付ける。[2008-12-20]
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
<applet alt="パッケージ名付きアプレット" codebase="classes" code="jp.hishidama.sample.applet.PackageApplet.class" width="256" height="256"> </applet>
複数のクラス(や画像等のリソース)を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
<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 alt="パラメーター指定アプレット" code="ParamApplet.class" width="256" height="256"> <param name="paramName" value="paramData"> </applet>
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] |