STUDENT_ID : 045754A
                              NAME       : Hayato.MIYAGI

              プログラミングII 課題8


課題
Java Appletのオリジナルプログラムを作成し解説せよ。

プログラム

STUDENT_ID : 045754A
NAME       : Hayato MIYAGI
Comment    : バッファリングを用いてます。

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

public class NoDoubleBuffer extends Applet
implements Runnable {
    int x = 0;  //int型整数xを宣言
	
    Thread t;     

    public void init() {
        
        //スレッドを開始する
        t = new Thread(this);
        t.start();
    }

    public void run() {
        try {
            while(true) {

                //再描画を要求する
                repaint();

                //ウィンドウを更新する前に休止する
                Thread.sleep(100);
            }
        }
        catch(Exception e) {
        }
    }

    public void paint(Graphics g) {

        //文字列を描画する
        Dimension d = getSize();

        g.setFont(new Font("serif", Font.BOLD, 36));    //フォントを指定している
        
        setBackground(Color.pink);

        g.setColor(Color.blue);         //文字列も色を青色に指定
        
        //表示する文字列の中身を座標を決定
        g.drawString("STUDENT_ID : 045754A", x, 50);
        g.drawString("NAME              : Hayato MIYAGI", x, 100);
        g.drawString("E-mail               : j04054@ie.u-ryukyu.ac.jp", x, 150);


        //x座標を増やす
        x += 5;
        if (x + 50 > d.width)
            x = 0;
    }
}

実行結果


  
  


考察
 今回のプログラムを作成するに当たって私が目標にしていたものは、動きのあるアプレットを
目指してました。そこで、いろいろサンプルを探していた所、バッファリング(教科書
「独習JAVA」のP413あたり)という手法を見つけることができました。
これ以下より、解説していきます。

			.
			.
			.
		
    public void init() {
        
        //スレッドを開始する
        t = new Thread(this);
        t.start();
    }

上の記述されているところから解説します。
 まず、init()メソッドはアプレットの実行が開始されるときにだけ呼び出されます。このメソッド
には1回だけ実行する必要がある処理(HTMLファイルに定義されたパラメータの読み取りなど)を書きま
す。
start()メソッドは、init()メソッドの実行が終わった後で実行されます。それ以外にも、アプレット
の実行を再開するときに、アプレットビューアかWebブラウザによって呼び出されます。


次は、、、

			.
			.
			.
			.
    public void run() {
        try {
            while(true) {


                repaint();


                Thread.sleep(100);
            }
        }
        catch(Exception e) {
        }
    }
				.
				.
				.
上記の部分についての考察				
 run()メソッドはスレッドの処理を行うために用いてます。
try文はコードの実行中に問題が発生したときのために用います。このとき、try文の中には
catchブロックが続いていて、先頭にはcatchステートメントがあり、引数が受け取られます。
ここでいう引数とは、発生した問題に関する情報を格納した例外オブジェクトです。
repaint()メソッドはJVMに対して、update()メソッドの呼び出しを要求しています。
thread.sleep()メソッドはスレッドを実行する間隔のことです。引数が0に近いほど、実行
速度は速くなります。

				.
				.
				.
			
    public void paint(Graphics g) {

        Dimension d = getSize();

        g.setFont(new Font("serif", Font.BOLD, 36));    
        
        setBackground(Color.pink);

        g.setColor(Color.blue);         
        
       
        g.drawString("STUDENT_ID : 045754A", x, 50);
        g.drawString("NAME              : Hayato MIYAGI", x, 100);
        g.drawString("E-mail               : j04054@ie.u-ryukyu.ac.jp", x, 150);


        x += 5;
        if (x + 50 > d.width)
            x = 0;
    }

				.
				.
				.
				
最後に、上記の部分について考察していきます。
public void paint(Graphics g)の中に描画したいコンポーネントを書いていきます。
Dimension d = getSize()はアプレットのサイズを調べるために必要です。
g.setFont()はフォントを指定しています。
setBackground()は背景色を決定するために必要です。
g.setColor()は描画色を決定するために必要です。
g.drawString()は文字列を描画するために使用しています。
if文はg.drawString()の中で指定したx座標をループさせることによって、描画された文字列が右側に移動していき、
d.widthの値を超えるまでxの値を増加させています。

以上で考察を終わります。

おまけプログラム

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

public class omake extends Applet
    implements Runnable {
    int x,y = 0;
    Thread t;

    public void init() {

        //スレッドを開始する
        t = new Thread(this);
        t.start();
    }

    public void run() {
        try {
            while(true) {

                //再描画を要求する
                repaint();

                //ウィンドウを更新する前に休止する
                Thread.sleep(10);
                

            }
        }
        catch(Exception e) {
        }
    }

    public void paint(Graphics g) {

        //文字列を描画する
        Dimension d = getSize();

        g.setFont(new Font("serif", Font.BOLD, 36));    //文字列のフォントを指定している

        setBackground(Color.black);      //背景色を黒に指定

        g.setColor(Color.white);         //文字列の色を白に指定

        //表示する文字列の中身を座標を決定
        g.drawString("!!ogamaTamaN  emoGamaN  iguMamaN", x, 50);
        


        //x座標を増やす
        x += 5;
        if (x + 50 > d.width)
            x = 0;
    }
}

実行結果


  
  


解説
画面のちらつきがひどくて何が描画されているか一瞬ではわかりませんが、よく見ると、
「生麦 生米 生たまご」 ->「NamaMugi NamaGome NamaTamago!!」と逆さから
描画しています。速読の練習になるかなと思って作りましたが、とても自慢できるものでは
ありませんでした。たぶん、ダブルバッファリングを用いると少し良くなったかもしれません。
感想と反省
最後の課題は、「自分オリジナルのプログラムを作成せよ」ということで、何をアプレットで
表現しようかと考え、悩む時間のほうがけっこうかかりました。しかし、表現したいものが決まって
からは作業が早く進みました。ひらめいたときに一気に終わらせてしまおうと思っても、途中で調べもの
をしたりと、あっという間に時間が経ってしまってあせりましたが、なんとか最後の課題は期限内に提出
できたので一安心しました。前期、後期とプログラミングの授業を受講してきましたが、課題を提出できた
ときの達成感を味わうたびに嬉しくなりました。とても楽しく受講できました。
前期、後期とお世話になりました。一年間ありがとうございました!

参考文献
  独習Java第2版               ジョセフ.オニール 著
                       トップスタジオ  訳
                       武藤 健志   監修