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

java.applet パッケージ

現実的なアプレット






java.applet パッケージ

現実的なアプレット

では、AWTに関して例示した例をアプレットに書き直して見よう。当然クラスを再利用して作るので、メインクラスだけを新たに作成する。これも再利用のメリットの1つである。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.applet.*;  /* 新たにこれを import する */

public class NecoApplet extends Applet {  /* 当然 Applet クラスを継承する */
    private NecoImageCanvas canvas;  /* 具象 Canvas クラス */
    private NecoMediator med;        /* スレッド */

    private static String backImage = null; /* 背景画像名 */
    private static String foreImage = null; /* 移動画像名 */
    private Image back = null;  /* 背景画像 */
    private Image fore = null;  /* 移動画像 */
    private int width = 300;    /* トップレベルのウィンドウ幅 */
    private int height = 250;   /* トップレベルのウィントウ高さ */

    public void init( ) {       /* Applet のメインは init メソッドである */
        boolean loadError = false;  /* Applet ではエラー処理が単純にはいかない */
        String reason = "";         /* エラーの原因を保持 */
        med = new NecoMediator();

        /* getParameter で PARAM タグに設定された背景画像名を取得 */
        backImage = getParameter( "backImage" );
        if( backImage != null ) {
            back = loadImage( backImage );
            if( back != null ) {
                width = back.getWidth( this ); 
                height = back.getHeight( this );
            } else {
                loadError = true; 
                reason = "backImage " + backImage + " cannot load.";
            }
        } else {
            loadError = true; reason = "Parameter backImage is not set.";
        }

        /* getParameter で PARAM タグに設定された移動画像名を取得 */
        foreImage = getParameter( "foreImage" );
        if( foreImage != null ) {
            fore = loadImage( foreImage );
            if( fore == null ) {
                loadError = true; 
                reason = "foreImage " + foreImage + " cannot load.";
            }
        } else {
            loadError = true; reason = "Parameter foreImage is not set.";
        }

        canvas = new NecoImageCanvas( med, width, height );
        add( canvas );

        if( loadError ) {  
           /* エラーが起きていたら、ファイルではない画像を作って */
            back = createImage( width, height );  
            if( back != null ) {
                Graphics gi = back.getGraphics();  
                /* そこにエラーだと表示 */
                gi.setColor( new Color( 255, 0, 0 ) );
                gi.drawString( "ERROR.. see Java Console", 80, 30 );
                /* この出力はブラウザだと Java Console に出る */
                System.out.println( reason );  
            }
        }
        if( back != null ) canvas.setImage( back );
        if( ! loadError ) {
            canvas.setForeImage( fore );
            med.start();
        }
    }

    /* 画像名から実際の画像をすぐに使えるかたちで準備する定型的な処理 */
    /* しかし、セキュリティの上から、Applet ではやり方が違う */
    private Image loadImage( String name ) {
        Image ret = getImage( getDocumentBase(), name );
        if( ret != null ) {
            while( ! prepareImage( ret, this ) ) {
                int flag = checkImage( ret, this );
                if( (flag & ImageObserver.ERROR) != 0 ) {
                    return null;
                }
                try { 
                    Thread.sleep(200); 
                }  catch(InterruptedException e) { }
            }
        }
        return ret;
    }
}



copyright by K.Sugiura, 1996-2006