Deep Side of Java〜Java 言語再入門 第4回 〜 アプレット、スレッド、AWT

java.applet パッケージ






java.applet パッケージ

アプレットと通常の Java プログラムの違いは、ほとんど次の点に尽きる。

  1. アプレットは java.applet.Applet クラスを継承して作る。→要するにアプレットは一種の「フレームワーク」である。

  2. アプレットはAWTによるGUIプログラムである。だから、java.applet.Applet クラスの基底クラスは java.awt.Panel であり、単にGUIの中の1Containerであるに過ぎない。

  3. アプレット自体もスレッドとして動作している。そのため、開始や終了などは、自分で処理をせずにスレッドとしての処理に任せる。

  4. アプレットでは SecurityManager が危険な処理を監視しており、それらの危険な処理が実行されると、その実行直前許されている処理かどうかをチェックし、 SecurityException を投げて強制的にプログラムを停止する。

  5. ブラウザには大抵「Java Console」というような、特別なウィンドウが装備されている。ここに、通常のスタンドアロンプログラムならば起動ターミナルに表示されるような「System.out.println()」による出力や、例外処理のスタックトレースが表示される。つまり、System.out が特別に上書きされているのである。

  6. デバッグ用途のために、ブラウザを起動せずにチェックするための特別なビューアである「appletviewer」が用意されている。appletviewer の引数としては、そのアプレットを呼び出すHTMLファイル名を指定する。

  7. アプレットはブラウザが持つインタプリタで実行されるが、そのインタプリタのJDKバージョンは 1.1 より上のものは期待できない。それゆえ互換性を考慮すると、JDK1.1 版のコンパイルを行わなくてはならない。このため、コンパイル行は「javac -deprecation -target 1.1 MyApplet.java」のようになる。

java.applet.Applet クラスで独自に定義されているメソッドの中で、アプレットのライフサイクルと構造を示すものは次の通り。これらは Applet クラスでは何もしないように定義されており、それを上書きして実際の処理を記述する。

public void init()
アプレットが開始される時に、アプレットスレッドから1度だけ呼び出されるメソッドである。要するにアプレットではこのメソッドを必ず上書きし、必要なWidgetを生成して装備しておく。当然、自分自身をコンストラクタによって生成する必要はない。→ボタンなどのウィジットのアクションは当然あらかじめ登録されたイベントハンドラがすることになるし、アニメ処理などは、普通はスレッドを立ててスレッドに実現させる。だから、この init() は普通に「終わってしまう」のが正しい処理である。

public void stop()
そのアプレットがブラウザによってバックグラウンドに回された時に呼び出される。もし、別スレッドを実行していて、その処理が重い場合などには、この stop メソッドを上書きして別スレッドの処理を行わないようにするもの良かろう。

public void start()
そのアプレットがブラウザによってフォラグラウンドで表示された時に呼び出される。これは stop メソッドと対応するメソッドであり、特に stop メソッドを使わないのならば、何もする必要はない。つまり、一時停止されていた別スレッドを再開するなどの処理を記述するものであり、init メソッドと違って何回でも呼び出される可能性があることに注意されたい。

public void destroy()
そのアプレットが破棄される時に呼び出される。一般にアプレットは永続するリソースを利用しないので、ほとんどの場合これに処理を与える必要はない。

アプレット内部で利用価値の高い Applet クラスメソッドには次のものがある。

public String getParameter(String name)
タグによって与えられたアプレットパラメータを、そのキー(paramタグのname属性)によって取得する。非常に残念なことだが、アプレットパラメータをすべて列挙するインターフェイスは存在していない。プログラムの上で「ありそうな」パラメータ名について、ホントにあるかどうかをチェックすることしかできないのである。

public void showStatus(String mes)
よくブラウザにはその下部に「ステータス行」が存在する。ここにメッセージを表示する。「ステータス行」が変な所にあるブラウザ(Opera)もあるので、要注意。

public URL getDocumentBase()、public URL getCodeBase()
そのアプレットを呼び出したHTMLファイルや、そのアプレット自身のURLを返す。

public Image getImage(URL url, String imgfilename)
指定されたURLから画像ファイル(GIFかJPEG)をダウンロードして取得する。とはいえ、これは Proxy であり、完全にダウンロードが済んでいなくても、成功して戻るので要注意である。一般に init メソッドでは、そのアプレットが表示される前に、完全に画像イメージを取得して準備完了にしておきたいケースが多い。次のコードが完全な読み込みを強制する定型的な処理である。

Image loadImage( String name ) {
    /* 読み込んだHTMLファイルのURLを基準にして画像ファイルをロード */
    Image ret = getImage( getDocumentBase(), name );
    if( ret != null ) {
    /* prepareImage は、Component クラスのメソッドで、画像イメージを読み込んで
       使えるように用意する。本当は ImageObserver という進捗状況を報告できる
       インターフェイスとの関連があり、そのために第二引数として ImageObserver 
       を取るのだが、これは Applet 自体が Component であり、Component が
       ImageObserver を implements しているので配慮しなくてOKである */
        while( ! prepareImage( ret, this ) ){
            /* ファイルが存在しないなどの対策 */
            if( (checkImage( ret, this ) 
                 & ImageObserver.ERROR) != 0 ){
                 return null;
            } 
            /* 適当に休みながらチェックする */
            try { 
                Thread.sleep(200); 
            }  catch(InterruptedException e) { }
        }
    }
    return ret;
}



copyright by K.Sugiura, 1996-2006