import java.applet.Applet;
import java.awt.Graphics;

/**
 * テキストを表示するだけのアプレット・テンプレート。
 * 
 * - Desktop Java - Java Plug-in Technology
 *   http://java.sun.com/products/plugin/
 *
 * - appletviewer - Java アプレットビューア [Solaris および Linux]
 *   http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/solaris/appletviewer.html
 *
 * - appletviewer - Java アプレットビューア [Windows]
 *   http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/appletviewer.html
 *
 * since 2007-02-07
 */
public class BannerApplet extends Applet {

    // 表示するメッセージ文字列
    private String message;
    
    /**
     * (Java 2 Platform Standard Edition 5.0 API 仕様より)
     * 
     * ブラウザまたはアプレットビューアによって呼び出され、
     * このアプレットがシステムにロードされたことを通知します。
     * このメソッドは、start メソッドが最初に呼び出される前に
     * 常に呼び出されます。
     * 
     * Applet のサブクラスで初期化処理を行う場合は、
     * このメソッドをオーバーライドする必要があります。
     * たとえば、スレッドを使用するアプレットの場合は、
     * init メソッドでスレッドを作成し、
     * destroy メソッドでスレッドを破棄します。
     * 
     * Applet クラスのこのメソッドでは何も行いません。 
     */
    public void init() {

        // getParameter メソッドにて、
        // HTML タグ内にあるパラメータの値を取得。
        //
        // <applet code="BannerApplet.class" width="320" height="240">
        // <param  name="message"      value="こんにちは、あぷれっと。">
        // Java アプレットを実行できていません。
        // </applet>
        message = getParameter("message");
        if(message == null){
            message = "This is BannerApplet! Set parameter 'message' to a param tag.";
        }
    }
    
    /**
     * (Java 2 Platform Standard Edition 5.0 API 仕様より)
     * 
     * ブラウザまたはアプレットビューアによって呼び出され、
     * このアプレットの再生中に、割り当てられたすべてのリソースを
     * 破棄する必要があることを通知します。
     * destoroy メソッドの前に、stop メソッドが必ず呼び出されます。
     * 
     * 破棄する前になんらかの処理を行う場合は、
     * Applet のサブクラスではこのメソッドを
     * オーバーライドする必要があります。
     * たとえば、スレッドを使用するアプレットの場合は、
     * init メソッドでスレッドを作成し、
     * destroy メソッドでスレッドを破棄します。
     * 
     * Applet クラスのこのメソッドでは何も行いません。 
     */
    public void destroy() {
        super.destroy();
    }
    
    /**
     * (Java 2 Platform Standard Edition 5.0 API 仕様より)
     * 
     * ブラウザまたはアプレットビューアによって呼び出され、
     * このアプレットの実行を開始する必要があることを通知します。
     * このメソッドは、init メソッドのあとに呼び出され、
     * Web ページ上でアプレットがアクティブになるたびに呼び出されます。
     * 
     * アプレットを含む Web ページが表示されるたびに
     * なんらかの処理を行う場合は、Applet のサブクラスでは
     * このメソッドをオーバーライドする必要があります。
     * たとえば、アニメーションを含むアプレットの場合は、
     * start メソッドでアニメーションを再生し、
     * stop メソッドでアニメーションを停止します。
     * 
     * 注: getLocationOnScreen などのメソッドのいくつかは、
     * アプレットが表示されている場合は意味のある結果しか提供できません。
     * アプレットの start が先に呼び出された場合、
     * isShowing は false を返すので、true を返すために必要な
     * isShowing は ComponentListener から呼び出される必要があります。
     * 
     * Applet クラスのこのメソッドでは何も行いません。 
     */
    public void start() {
        super.start();
    }
    
    /**
     * (Java 2 Platform Standard Edition 5.0 API 仕様より)
     * 
     * ブラウザまたはアプレットビューアによって呼び出され、
     * このアプレットの実行を停止する必要があることを通知します。
     * このメソッドは、アプレットを含む Web ページの代わりに
     * 別の Web ページが表示されたとき、およびアプレットが
     * 破棄される直前に呼び出されます。
     * 
     * アプレットを含む Web ページが非表示になるたびに
     * なんらかの処理を行う場合は、Applet のサブクラスでは
     * このメソッドをオーバーライドする必要があります。
     * たとえば、アニメーションを含むアプレットの場合は、
     * start メソッドでアニメーションを再生し、
     * stop メソッドでアニメーションを停止します。
     * 
     * Applet クラスのこのメソッドでは何も行いません。 
     */
    public void stop() {
        super.stop();
    }
    
    /**
     * アプレット内の描画を行います。
     */
    public void paint(Graphics g) {
        int x = 0;
        int y = g.getFontMetrics().getAscent();
        // 第2引数・第3引数は、左端の文字のベースライン位置(x,y)
        g.drawString(message, x, y);
        super.paint(g);
    }
    
    /**
     * 親クラスでは、
     * 背景色で塗りつぶし -> repaint メソッドの呼び出し
     * という処理をしています。
     * 背景色で塗りつぶしを行うことで画面がチラつく可能性がある場合は、
     * このメソッドをオーバーライドして、自前で制御を行います。
     */
    public void update(Graphics g) {
        repaint(); // アプレットに描画の要求をする
    }
}
