Report#8:Java Applet/AWTプログラミング

Java Applet/AWTについて学び、Java Appletのオリジナルプログラムを作成し解説せよ。


ソースとアプレットはこちら。(解説はソースコード中に記述.)

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Myapplet extends Applet implements ActionListener,Runnable{
    MyCanvas c1;      //(1):各メソッドで使用する変数、クラスのインスタンスを
    Button btn1,btn2; //   宣言.
    boolean flag;
    int x,y,ax,ay;
    Color c;
    char c0;
    Font f;
    int count = 0;

    public void init() { //(2):initメソッドの実行内容を設定.
        flag = false;     //    ボタンの配置やメソッドのフィールドの初期化
        x = 10;           //    を行う.Javaアプリケーションでのコンストラクタ
         y = 10;          //    と同じ働き.
        Random r1 = new Random();
        ax = r1.nextInt(21)-10;
        ay = r1.nextInt(21)-10;
        int r = r1.nextInt(255);
        int g = r1.nextInt(255);
        int b = r1.nextInt(255);
        c = new Color(r,g,b);
        c0 = (char)(r1.nextInt(26)+65);
        f = new Font("Dialog",Font.BOLD,r1.nextInt(24)+24);


        this.setLayout(null);
         c1 = new MyCanvas();
        this.add(c1); c1.setBounds(0,0,500,150);
        btn1 = new Button("Click Me!");
        this.add(btn1); btn1.setBounds(180,240,70,30);
        btn2 = new Button("Stop!");
        this.add(btn2); btn2.setBounds(260,240,70,30);

        btn1.addActionListener(this);
        btn2.addActionListener(this);

    }
        public void actionPerformed(ActionEvent e) { 
            if(e.getSource() == btn1){   //(3):ボタンをクリックした際の
                this.count++;            //    プログラムの反応を設定.     
                this.repaint();         //    btn1のボタンを押すと、start()
                this.start();           //   メソッドの再実行とrepaint()の
            }else{                      //   実行が行われる.
                doStop();
                this.count = 0;
            }
        }

            public void start(){      //(4):アプレットの開始.開始と同時に
            Thread t1 = new Thread(this);//   スレッドの生成と実行を始める.
            t1.start();                  
            }

        public void doStop() {   //(5):スレッドを停止する際に使用するメソッド。
            flag = false;        //    run()メソッド内の動作条件フラグの
        }                        //    切り換えをする。


    public void run() {   //(6):スレッドのrun()メソッドの定義.条件フラグが
        flag = true;      //    真の間、クラスMyCanvasで生成したGUI部品上で
        while(flag){      //    描画するテキストの生成と、テキストを動かす
            move();       //    際に必要な座標等の設定を行い、それをGUI
            c1.x = x;     //    コンポーネントのCanvas上で動かす.
            c1.y = y;
            c1.setColor(c);
            c1.setChar(c0);
            c1.setFont(f);
            c1.repaint();
            try {               //(7):スレッドの実行速度の調整.100ミリ秒単位で
                Thread.sleep(100);  //スレッドを一時停止し、テキストの移動の  
            }catch(Exception e) {}  //スピードを調整.
        }
    }

    public void move(){   //(8):テキストの移動先の座標を設定するメソッド.
        x += ax;            //     動作する場所となるGUI部品の幅と長さを
        y += ay;           //     引数として取る。
    if(x < 0) {
        x = 0;
        ax *= -1;
    }
    if(x > c1.getSize().width) {
        x = c1.getSize().width;
        ax *= -1;
    }
    if (y < 0) {
        y = 0;
        ay *= -1;
    }
    if (y > c1.getSize().height) {
        y = c1.getSize().height;
        ay *= -1;
    }
    }

    public void stop() {  //アプレット終了時の処理.あっても無くても良かった
        this.count = 0;     //かもしれない. 
    }

    public void paint(Graphics gs) {
        gs.drawString("Speed: +" + (new Integer(count)).toString(),30,270);
    }  //(9):スタートボタンのクリック回数を表示するメソッド.
       //    生成したスレッドとは独立して動いています.
class MyCanvas extends Canvas{  //(10):スレッドの実行対象になるGUI部品
    int x,y;                    //     のクラス.移動テキストの生成と、
    Color c;                    //    移動テキストを表示するGUIコンポーネントの
    String s;                   //   生成を行う.
    Font f;

    public void setColor(Color c1) {
        c = c1;
    }

    public void setChar(char c1){
        s = "" + c1;
    }
    public void setFont(Font f1) {
        f = f1;
    }
    public void paint (Graphics g) {
        if (c != null) {
            g.setColor(c);
            g.setFont(f);
            g.drawString(s,x,y);
        }
    }
}

}

アプレット出力はこちらです.

課題を終えての感想

いろいろあって、課題の提出が延び延びになっていました.
しかも締め切り四日前に、自分のパソコンがイカレてしまい、課題の進行が危うくなった事もあって、しょぼいアプレットになってしまいました.
このソースは、Javaアプリケーションで動くものを、無理矢理アプレット用にしたものです.しょぼい割に長いソースですが、自分なりに工夫してアプレットのコードにしました.まあ、アプレットとアプリケーションの違いを学習する意味では、いい勉強になりました.
Javaプログラミングの課題はこれで終了ですが、C言語と同様に、これからも自分でもっと勉強していきたいと思います.
半年間ありがとうございました.

参考文献、サイト

浅煎り珈琲Javaアプリケーション:
Java&Cocoaプログラミングバイブル:掌田津耶乃:2002年発行:秀和システム