Javaアプレット入門:基礎と主要な違い
アプレットとは
アプレットはWebブラウザ上で実行されるJavaプログラムです。アプレットはJava API全体を利用できるため、完全に機能するJavaアプリケーションとなり得ます。
アプレットとスタンドアロンのJavaアプリケーションには、以下のような重要な違いがあります:
- アプレットはjava.applet.Appletクラスを継承したJavaクラスです。
- アプレットでは
main()メソッドは呼び出されず、アプレットクラスでmain()を定義しません。 - アプレットはHTMLページ内に埋め込まれるよう設計されています。
- ユーザーがアプレットを含むHTMLページを表示すると、アプレットのコードがユーザーのマシンにダウンロードされます。
- アプレットの表示にはJVMが必要です。JVMはWebブラウザのプラグインまたは別のランタイム環境のいずれかです。
- ユーザーのマシン上のJVMがアプレットクラスのインスタンスを作成し、アプレットの生涯中に様々なメソッドを呼び出します。
- アプレットにはWebブラウザによって施行される厳格なセキュリティルールがあります。アプレットのセキュリティはしばしばサンドボックスセキュリティと呼ばれ、様々なルールに従わなければならない砂場で遊ぶ子供に例えられます。
- アプレットが必要とする他のクラスは、単一のJava Archive(JAR)ファイルでダウンロードできます。
アプレットのライフサイクル
Appletクラスの4つのメソッドが、本格的なアプレットを構築するためのフレームワークを提供します:
- init - アプレットに必要な初期化を行うためのメソッド。アプレットタグ内のparamタグが処理された後に呼び出されます。
- start - ブラウザがinitメソッドを呼び出した後に自動的に呼び出されます。ユーザーが他のページに移動した後、アプレットを含むページに戻ったときにも呼び出されます。
- stop - ユーザーがアプレットのあるページから離れると自動的に呼び出されます。したがって、同じアプレットで繰り返し呼び出される可能性があります。
- destroy - ブラウザが正常にシャットダウンするときのみ呼び出されます。アプレットはHTMLページ上で生きることを意図しているため、ユーザーがアプレットを含むページを離れた後、通常はリソースを残さないようにすべきです。
- paint - start()メソッドの直後に呼び出され、またブラウザでアプレットが再描画する必要があるときにも呼び出されます。paint()メソッドは実際にはjava.awtから継承されています。
"Hello, World"アプレット
HelloWorldApplet.javaというシンプルなアプレットの例です:
import java.applet.*;
import java.awt.*;
public class HelloWorldApplet extends Applet {
public void paint(Graphics g) {
g.drawString("Hello World", 25, 50);
}
}
これらのimport文により、以下のクラスがアプレットクラスのスコープに導入されます:
- java.applet.Applet
- java.awt.Graphics
これらのimport文がないと、Javaコンパイラはアプレットクラスが参照するAppletクラスとGraphicsクラスを認識できません。
Appletクラス
すべてのアプレットはjava.applet.Appletクラスの拡張です。基底Appletクラスは、派生Appletクラスが呼び出してブラウザコンテキストから情報やサービスを取得するためのメソッドを提供します。
これらには以下の機能を持つメソッドが含まれます:
- アプレットパラメータの取得
- アプレットを含むHTMLファイルのネットワーク上の位置取得
- アプレットクラスディレクトリのネットワーク上の位置取得
- ブラウザへのステータスメッセージ出力
- 画像の取得
- オーディオクリップの取得
- オーディオクリップの再生
- アプレットのリサイズ
また、Appletクラスはビューアまたはブラウザがアプレットについての情報を取得し、アプレットの実行を制御するためのインターフェースを提供します。ビューアは以下が可能です:
- アプレットの作者、バージョン、著作権に関する情報の要求
- アプレットが認識するパラメータの説明の要求
- アプレットの初期化
- アプレットの破棄
- アプレットの実行開始
- アプレットの実行停止
Appletクラスはこれら各メソッドのデフォルト実装を提供します。必要に応じてそれらをオーバーライドできます。
"Hello, World"アプレットは現状のままでも完成しています。オーバーライドされているのはpaintメソッドのみです。
アプレットの呼び出し
アプレットは、HTMLファイルにディレクティブを埋め込み、アプレットビューアまたはJava対応ブラウザでファイルを表示することで呼び出されます。
<applet>タグは、HTMLファイルにアプレットを埋め込む基礎となります。"Hello, World"アプレットを呼び出す例:
<html> <title>The Hello, World Applet</title> <hr> <applet code="HelloWorldApplet.class" width="320" height="120"> If your browser was Java-enabled, a "Hello, World" message would appear here. </applet> <hr> </html>
注意 - HTMLアプレットタグを参照して、HTMLからのアプレット呼び出しについて詳しく理解してください。
<applet>タグのcode属性は必須です。実行するAppletクラスを指定します。widthとheightも、アプレットが実行されるパネルの初期サイズを指定するために必須です。アプレットディレクティブは</applet>タグで閉じる必要があります。
アプレットがパラメータを取る場合、<applet>と</applet>の間に<param>タグを追加してパラメータの値を渡せます。ブラウザはアプレットタグ間のテキストや他のタグを無視します。
Java非対応ブラウザは<applet>と</applet>を処理しません。したがって、タグ間にあるアプレットに関係ないものは、Java非対応ブラウザで表示されます。
ビューアやブラウザは、ドキュメントの場所でコンパイル済みJavaコードを探します。別の場所を指定するには、<applet>タグのcodebase属性を使用します:
<applet codebase="https://amrood.com/applets" code="HelloWorldApplet.class" width="320" height="120">
アプレットがデフォルト以外のパッケージに存在する場合、ピリオド(.)でパッケージ/クラス成分を区切ってcode属性に保持パッケージを指定する必要があります:
<applet code="mypackage.subpackage.TestApplet.class" width="320" height="120">
アプレットパラメータの取得
ドキュメントで指定されたセットアップパラメータに応答するアプレットの作り方を示す例です。このアプレットは、黒と第2の色のチェッカーボードパターンを表示します。
第2の色と各正方形のサイズは、ドキュメント内でアプレットへのパラメータとして指定できます。
CheckerAppletはinit()メソッドでパラメータを取得します。paint()メソッドでも取得可能ですが、毎回のリフレッシュ時ではなく、アプレット開始時に一度値を取得して設定を保存する方が便利で効率的です。
アプレットビューアまたはブラウザは、実行する各アプレットのinit()メソッドを呼び出します。ビューアはアプレット読み込み直後に一度だけinit()を呼び出します。(Applet.init()は何もしない実装になっています。)カスタム初期化コードを挿入するためにデフォルト実装をオーバーライドします。
Applet.getParameter()メソッドは、パラメータ名を指定してパラメータを取得します(パラメータの値は常に文字列)。値が数値やその他の非文字データの場合、文字列をパースする必要があります。
CheckerApplet.javaのスケルトン:
import java.applet.*;
import java.awt.*;
public class CheckerApplet extends Applet {
int squareSize = 50; // デフォルトサイズで初期化
public void init() {}
private void parseSquareSize(String param) {}
private Color parseColor(String param) {}
public void paint(Graphics g) {}
}
CheckerAppletのinit()とプライベートparseSquareSize()メソッド:
public void init() {
String squareSizeParam = getParameter("squareSize");
parseSquareSize(squareSizeParam);
String colorParam = getParameter("color");
Color fg = parseColor(colorParam);
setBackground(Color.black);
setForeground(fg);
}
private void parseSquareSize(String param) {
if (param == null) return;
try {
squareSize = Integer.parseInt(param);
} catch (Exception e) {
// デフォルト値を維持
}
}
アプレットはparseSquareSize()を呼び出してsquareSizeパラメータをパースします。parseSquareSize()はライブラリメソッドInteger.parseInt()を呼び出し、文字列をパースして整数を返します。引数が無効な場合、Integer.parseInt()は例外をスローします。
したがって、parseSquareSize()は例外をキャッチし、不正な入力でアプレットが失敗するのを防ぎます。
アプレットはparseColor()を呼び出してcolorパラメータをColor値にパースします。parseColor()は一連の文字列比較を行い、パラメータ値を定義済み色の名前と照合します。このアプレットを動作させるにはこれらのメソッドを実装する必要があります。
アプレットパラメータの指定
CheckerAppletを埋め込んだHTMLファイルの例です。HTMLファイルは<param>タグでアプレットへの両パラメータを指定しています。
<html> <title>Checkerboard Applet</title> <hr> <applet code="CheckerApplet.class" width="480" height="320"> <param name="color" value="blue"> <param name="squaresize" value="30"> </applet> <hr> </html>
注意 - パラメータ名は大文字小文字を区別しません。
アプリケーションからアプレットへの変換
グラフィカルなJavaアプリケーション(AWTを使用し、Javaプログラムランチャーで起動できるもの)を、Webページに埋め込めるアプレットに変換するのは容易です。
アプリケーションをアプレットに変換する具体的な手順:
- アプレットコードを読み込む適切なタグを含むHTMLページを作成する。
- JAppletクラスのサブクラスを用意する。このクラスをpublicにする。そうでないとアプレットを読み込めない。
- アプリケーションのmainメソッドを削除する。アプリケーション用のフレームウィンドウを構築しない。アプリケーションはブラウザ内で表示される。
- フレームウィンドウコンストラクタから初期化コードをアプレットのinitメソッドに移動する。アプレットオブジェクトを明示的に構築する必要はない。ブラウザがインスタンス化し、initメソッドを呼び出す。
setSizeの呼び出しを削除。アプレットでは、HTMLファイルのwidthとheightパラメータでサイズ指定する。setDefaultCloseOperationの呼び出しを削除。アプレットは閉じられない。ブラウザが終了すると終了する。- アプリケーションが
setTitleを呼び出している場合、その呼び出しを削除。アプレットにタイトルバーはない。(もちろん、HTMLのtitleタグでWebページ自体にタイトルを付けることは可能。) setVisible(true)を呼び出さない。アプレットは自動的に表示される。
イベント処理
アプレットはContainerクラスからイベント処理メソッドのグループを継承します。Containerクラスは、processKeyEventやprocessMouseEventなど特定タイプのイベント処理メソッドと、すべてを捕捉するprocessEventメソッドを定義しています。
イベントに反応するには、アプレットは適切なイベント固有のメソッドをオーバーライドする必要があります。
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;
public class ExampleEventHandling extends Applet implements MouseListener {
StringBuffer strBuffer;
public void init() {
addMouseListener(this);
strBuffer = new StringBuffer();
addItem("initializing the applet ");
}
public void start() { addItem("starting the applet "); }
public void stop() { addItem("stopping the applet "); }
public void destroy() { addItem("unloading the applet"); }
void addItem(String word) {
System.out.println(word);
strBuffer.append(word);
repaint();
}
public void paint(Graphics g) {
g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
g.drawString(strBuffer.toString(), 10, 20);
}
public void mouseEntered(MouseEvent event) { }
public void mouseExited(MouseEvent event) { }
public void mousePressed(MouseEvent event) { }
public void mouseReleased(MouseEvent event) { }
public void mouseClicked(MouseEvent event) { addItem("mouse clicked! "); }
}
このアプレットを以下のように呼び出します:
<html> <title>Event Handling</title> <hr> <applet code="ExampleEventHandling.class" width="300" height="300"> </applet> <hr> </html>
最初、アプレットは"initializing the applet. Starting the applet."と表示されます。その後、長方形内をクリックすると"mouse clicked"も表示されます。
画像の表示
アプレットはGIF、JPEG、BMPなどの形式の画像を表示できます。アプレット内で画像を表示するには、java.awt.GraphicsクラスのdrawImage()メソッドを使用します。
画像表示の全手順を示す例:
import java.applet.*;
import java.awt.*;
import java.net.*;
public class ImageDemo extends Applet {
private Image image;
private AppletContext context;
public void init() {
context = this.getAppletContext();
String imageURL = this.getParameter("image");
if(imageURL == null) { imageURL = "java.jpg"; }
try {
URL url = new URL(this.getDocumentBase(), imageURL);
image = context.getImage(url);
} catch (MalformedURLException e) {
e.printStackTrace();
context.showStatus("Could not load image!");
}
}
public void paint(Graphics g) {
context.showStatus("Displaying image");
g.drawImage(image, 0, 0, 200, 84, null);
g.drawString("www.javalicense.com", 35, 100);
}
}
このアプレットを以下のように呼び出します:
<html> <title>The ImageDemo applet</title> <hr> <applet code="ImageDemo.class" width="300" height="200"> <param name="image" value="java.jpg"> </applet> <hr> </html>
オーディオの再生
アプレットは、java.appletパッケージのAudioClipインターフェースで表されるオーディオファイルを再生できます。AudioClipインターフェースには以下の3つのメソッドがあります:
- public void play() - オーディオクリップを最初から1回再生します。
- public void loop() - オーディオクリップを継続的にリプレイします。
- public void stop() - オーディオクリップの再生を停止します。
AudioClipオブジェクトを取得するには、AppletクラスのgetAudioClip()メソッドを呼び出す必要があります。getAudioClip()メソッドは、URLが実際のオーディオファイルに解決されるかどうかに関わらず即座に返ります。オーディオファイルは、オーディオクリップの再生が試みられるまでダウンロードされません。
オーディオ再生の全手順を示す例:
import java.applet.*;
import java.awt.*;
import java.net.*;
public class AudioDemo extends Applet {
private AudioClip clip;
private AppletContext context;
public void init() {
context = this.getAppletContext();
String audioURL = this.getParameter("audio");
if(audioURL == null) { audioURL = "default.au"; }
try {
URL url = new URL(this.getDocumentBase(), audioURL);
clip = context.getAudioClip(url);
} catch (MalformedURLException e) {
e.printStackTrace();
context.showStatus("Could not load audio file!");
}
}
public void start() {
if(clip != null) { clip.loop(); }
}
public void stop() {
if(clip != null) { clip.stop(); }
}
}
このアプレットを以下のように呼び出します:
<html> <title>The ImageDemo applet</title> <hr> <applet code="ImageDemo.class" width="0" height="0"> <param name="audio" value="test.wav"> </applet> <hr> </html>
お手持ちのPCでtest.wavを使って上記例をテストできます。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較
- Javaアプレット入門:基礎と主要な違い