Java-applet-basics

提供:Dev Guides
移動先:案内検索

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);
   }
}

これらのインポート文は、クラスをアプレットクラスのスコープに入れます-

  • java.applet.Applet
  • java.awt.Graphics

これらのインポート文がないと、Javaコンパイラは、アプレットクラスが参照するクラスAppletおよびGraphicsを認識しません。

アプレットクラス

すべてのアプレットは、_java.applet.Applet class_の拡張です。 ベースAppletクラスは、派生アプレットクラスがブラウザコンテキストから情報とサービスを取得するために呼び出すメソッドを提供します。

これらには、次のことを行うメソッドが含まれます-

  • アプレットのパラメーターを取得する
  • アプレットを含むHTMLファイルのネットワーク上の場所を取得します
  • アプレットクラスディレクトリのネットワークの場所を取得する
  • ブラウザーでステータスメッセージを印刷する
  • 画像を取得する
  • オーディオクリップを取得する
  • オーディオクリップを再生する
  • アプレットのサイズを変更する

さらに、アプレットクラスは、ビューアまたはブラウザがアプレットに関する情報を取得し、アプレットの実行を制御するインターフェイスを提供します。 視聴者は可能性があります-

  • アプレットの作成者、バージョン、著作権に関する情報を要求する
  • アプレットが認識するパラメーターの説明を要求する
  • アプレットを初期化する
  • アプレットを破壊する
  • アプレットの実行を開始します
  • アプレットの実行を停止する

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/html_applet_tag [HTMLアプレットタグ]を参照してください。

<applet>タグのcode属性が必要です。 実行するアプレットクラスを指定します。 アプレットが実行されるパネルの初期サイズを指定するには、幅と高さも必要です。 アプレットディレクティブは、</applet>タグで閉じる必要があります。

アプレットがパラメータを取る場合、<applet>と</applet>の間に<param>タグを追加することにより、パラメータの値を渡すことができます。 ブラウザは、アプレットタグ間のテキストおよびその他のタグを無視します。

Java非対応のブラウザーは、<applet>および</applet>を処理しません。 したがって、タグの間に表示され、アプレットに関連しないものはすべて、非Java対応ブラウザーで表示されます。

ビューアまたはブラウザは、ドキュメントの場所でコンパイル済みのJavaコードを探します。 別の方法で指定するには、次のように<applet>タグのcodebase属性を使用します-

<applet codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class"
   width = "320" height = "120">

アプレットがデフォルト以外のパッケージにある場合は、パッケージ/クラスコンポーネントを分離するために、ピリオド文字(。)を使用してコード属性で保持パッケージを指定する必要があります。 たとえば-

<applet  = "mypackage.subpackage.TestApplet.class"
   width = "320" height = "120">

アプレットパラメータの取得

次の例は、ドキュメントで指定されたセットアップパラメータにアプレットを応答させる方法を示しています。 このアプレットは、黒と2番目の色の市松模様を表示します。

各正方形の2番目の色とサイズは、ドキュメント内のアプレットのパラメーターとして指定できます。

CheckerAppletは、init()メソッドでパラメーターを取得します。 paint()メソッドでパラメーターを取得することもできます。 ただし、更新のたびにではなく、アプレットの起動時に値を取得して設定を1回保存すると便利で効率的です。

アプレットビューアまたはブラウザは、実行する各アプレットのinit()メソッドを呼び出します。 ビューアは、アプレットをロードした直後にinit()を1回呼び出します。 (Applet.init()は何もしないように実装されています。)デフォルトの実装をオーバーライドして、カスタム初期化コードを挿入します。

Applet.getParameter()メソッドは、指定されたパラメーターの名前(パラメーターの値は常に文字列です)を指定してパラメーターを取得します。 値が数値またはその他の非文字データである場合、文字列を解析する必要があります。

以下はCheckerApplet.javaのスケルトンです-

import java.applet.*;
import java.awt.*;

public class CheckerApplet extends Applet {
   int squareSize = 50;  //initialized to default size
   public void init() {}
   private void parseSquareSize (String param) {}
   private Color parseColor (String param) {}
   public void paint (Graphics g) {}
}

ここにCheckerAppletのinit()およびprivate 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) {
     //Let default value remain
   }
}

アプレットは、parseSquareSize()を呼び出して、squareSizeパラメーターを解析します。 parseSquareSize()は、ライブラリメソッドInteger.parseInt()を呼び出します。このメソッドは、文字列を解析して整数を返します。 Integer.parseInt()は、引数が無効な場合に例外をスローします。

したがって、parseSquareSize()は、アプレットが不正な入力で失敗することを許可するのではなく、例外をキャッチします。

アプレットはparseColor()を呼び出して、色パラメーターを解析して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クラスのサブクラスを提供します。 このクラスを公開します。 そうしないと、アプレットをロードできません。
  • アプリケーションのメインメソッドを削除します。 アプリケーションのフレームウィンドウを構築しないでください。 アプリケーションがブラウザ内に表示されます。
  • 初期化コードをフレームウィンドウコンストラクターからアプレットのinitメソッドに移動します。 アプレットオブジェクトを明示的に構築する必要はありません。 ブラウザはそれをインスタンス化し、initメソッドを呼び出します。
  • setSizeの呼び出しを削除します。アプレットの場合、サイズ変更はHTMLファイルの幅と高さのパラメーターを使用して行われます。
  • setDefaultCloseOperationへの呼び出しを削除します。 アプレットを閉じることはできません。ブラウザが終了すると終了します。
  • アプリケーションがsetTitleを呼び出す場合、メソッドの呼び出しを削除します。 アプレットにはタイトルバーを使用できません。 (もちろん、HTMLタイトルタグを使用して、Webページ自体にタイトルを付けることができます。)
  • setVisible(true)を呼び出さないでください。 アプレットは自動的に表示されます。

イベント処理

アプレットは、Containerクラスからイベント処理メソッドのグループを継承します。 Containerクラスは、特定のタイプのイベントを処理するためのprocessKeyEventやprocessMouseEventなどのいくつかのメソッドと、processEventと呼ばれる1つのキャッチオールメソッドを定義します。

イベントに反応するには、アプレットは適切なイベント固有のメソッドをオーバーライドする必要があります。

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 apple ");
   }

   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) {
     //Draw a Rectangle around the applet's display area.
      g.drawRect(0, 0,
      getWidth() - 1,
      getHeight() - 1);

     //display the string inside the rectangle.
      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>

最初、アプレットは「アプレットの初期化」を表示します。 アプレットを起動します。」その後、四角形の内側をクリックすると、「マウスがクリックされました」も表示されます。

画像を表示する

アプレットは、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();
        //Display in browser status bar
         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()メソッドを呼び出す必要があります。 URLが実際のオーディオファイルに解決されるかどうかにかかわらず、getAudioClip()メソッドはすぐに戻ります。 オーディオファイルは、オーディオクリップを再生しようとするまでダウンロードされません。

以下は、オーディオを再生するためのすべての手順を示す例です-

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を使用できます。