Report8
		Day :2004/01/26
                ID  :035740F
		Name:根保光秀
		!!!  This Page Is Made By Shift JIS  !!!



   Report#8:JavaAppletプログラミング{〜2/9}
            Java Applet/AWTについて学び、JavaAppletのオリジナルプログラムを製作し解説せよ






















1.スレッド :Thread
スレッドとは、、、、
プログラムの処理単位の事です。
その複数のスレッドを同時に処理していく事をマルチスレッドと言います。

Javaでスレッドを実現するには2通りの方法があります。
1、Threadクラスを継承する
2、Runnableインターフェースを実装する

1の方法を使ってスレッドを使うプログラム

Threadクラスを継承するやり方です。
[j03040:java/rep#8/aaa] j03040% java List Tosh.java
File name:Tosh.java
 1:import java.applet.*;
 2:import java.awt.*;
 3:import java.awt.event.*;
 4:
 5:public class Tosh extends Thread{   //スレッドを継承
 6:    int x=0;
 7:    public void init(){
 8:    }
 9:    public void draw(Graphics g){       //描写処理
 10:    g.drawString("RASTAMAN",x,100);    //文字列描写
 11:    x=x+20;
 12:    if(x>500) x=0;
 13:    }
 14:    public void run(){             //runをオーバーライド
 15:    while(true){
 16:        try{                      //例外処理
 17:            Thread.sleep(200);
 18:        }catch(Exception ex){
 19:        }
 20:    }
 21:    }
 22:}


5:でThreadクラスを継承しています。
14:でrunメソッドをオーバーライドしています、
スレッドの処理は、runの中に書きます。

2の方法を使ってスレッドを使うプログラム

今度はRunnableを実装するやり方です。
[j03040:java/rep#8/aaa] j03040% java List Th.java
File name:Th.java
 1:import java.applet.*;
 2:import java.awt.*;
 3:import java.awt.event.*;
 4:
 5:public class Th extends Applet implements Runnable{      //Appletを継承、Runnableを実装
 6:    Thread th= null;          //スレッド1のインスタンス生成(null)
 7:    Tosh th1=new Tosh();      //スレッド2のインスタンス生成
 8:    int x=0;
 9:    public void init(){       //アプレットで一番最初に呼ばれるメソッド
 10:    setBackground(Color.white);
 11:    }
 12:     
 13:    public void start(){     //スレッドを開始するメソッド
 14:    if(th==null){
 15:        th=new Thread(this);  //スレッド1のインスタンス生成
 16:        th.start();          //スレッド1を開始
 17:        th1.start();         //スレッド2を開始
 18:    }
 19:    }
 20:    public void run(){       //runメソッド(処理が書かれている)
 21:    while(true){
 22:        try{              
 23:            repaint();       //再描写   
 24:                Thread.sleep(200);   //200m/sスリープ
 25:            }catch(Exception ex){  //例外処理
 26:            }
 27:    }
 28:    }
 29:    public void paint(Graphics g){     //描写処理
 30:    g.drawRect(x,50,80,30);            //四角形塗りつぶし
 31:    th1.draw(g);                       //スレッド2のdraw()を呼び出し
 32:    x=x+10; 
 33:    if(x>500)x=0;
 34:    }
 35:
 36:}

5:でアプレットを継承しています。
javaは多重継承はできないのでThreadを継承できません、でもスレッドの機能を使いたい、、、
そんな時にRunnableを実装する方法を使います。

6:でインスタンスを生成しています。
7:で上記のプログラムToshのインスタンスを生成しています。
13:startメソッドです、スレッドで最初に呼び出されるメソッドです。
startの次にrunが呼び出されます。
16:17:二つのスレッドをスタートさせています。
20:ここはスレッド1の処理が書かれているメソッドです、今回は再描写してスリープするだけの処理です。
29:描写処理です。グラフィックスを書く時に使います。
30:g.drawRectで図形を描写しています。
31:Toshのdrawメソッドを呼び出しています。


○実行結果ーーーーーー→ココ



スレッドで使うメソッド
メソッドで重要なモノを表にまとめてみました。
重要なメソッド
説明
run() スレッドの処理を書く所、runの終わり=スレッドの終わりなので
一番重要なメソッドです。
Runnableを継承した場合は必ずオーバーライドしなければならない。
start() スレッドの実行を開始させるメソッド
これがないとスレッドが始まらない。
sleep スレッドを一定時間スリープさせる(一時停止)
destroy() クリーンアップを行わないでスレッドを破棄します。
interrupt() スレッドに割り込みます。




○オリジナルプログラム

○プログラム


test.java、メインのプログラム
[j03040:java/rep#8/kan] j03040% java List test.java
File name:test.java
 1:import java.awt.*;
 2:import java.awt.event.*;       
 3:import java.applet.*;
 4: 
 5:public class test extends Applet implements Runnable,
 6:ActionListener{            //Appletを継承、Runnable,ActionListenerを実装
 7: 
 8:    int x,y;
 9:    static int sp1,sp2;    //スピード変数
 10:    Image i,m;            //イメージを格納する変数
 11:    Thread thread;        //スレッド
 12:    back th=new back();   //back()のインスタンスを生成(backは下記参照)
 13:
 14:    Label x0=new Label("Zoomer");      //GUI部品ラベルを生成
 15:    Label x1=new Label("DioZx98'ver");
 16:    Button acz=new Button("Full Throttle");     //GUI部品ボタンを生成  
 17:    Button acx=new Button("Full Throttle");
 18:    Button brz=new Button("Durm Brake");
 19:    Button brx=new Button("Disk Brake");
 20:    Button engz=new Button("Engine Trouble!!");
 21:    Button engx=new Button("Engine Trouble!!");
 22:
 23:    public void init(){     //最初に呼ばれるメソッド
 24:    setLayout(null);            //レイアウトを自分で決める
 25:    sp1=4;sp2=6;        
 26:    setBackground(Color.white); //背景の色を設定
 27:    w=getSize().width;          //アプレットの横の長さを取得
 28:    i=getImage(getDocumentBase(),"Zm.gif");  //画像の場所を取得
 29:    m=getImage(getDocumentBase(),"Zx.gif");
 30: //GUI部品の登録&張り付け
 31:    add(x0); x0.setBounds(10,205,100,30);    
 32:    add(x1); x1.setBounds(130,205,100,30);
 33:    add(acz); acz.setBounds(10,230,100,30);
 34:    add(acx); acx.setBounds(130,230,100,30);
 35:    add(brz); brz.setBounds(10,255,100,30);
 36:    add(brx); brx.setBounds(130,255,100,30);
 37:    add(engz); engz.setBounds(10,290,120,30);
 38:    add(engx); engx.setBounds(130,290,120,30);
 39:    acz.addActionListener(this);          //AcrionListenerに登録
 40:    acx.addActionListener(this);
 41:    brz.addActionListener(this);
 42:    brx.addActionListener(this);
 43:    engz.addActionListener(this);
 44:    engx.addActionListener(this);
 45:    }
 46: 
 47:    public void start(){             //スレッドを開始させる 
 48:    thread = new Thread( this );     //インスタンス生成
 49:    thread.start();                  //thred開始
 50:    th.start();                      //back開始
 51:    }
 52: 
 53:    public void stop(){              //Applet終了の時の処理
 54:    thread = null;                   //スレッドを空にする
 55:    }
 56:    
 57:    public void paint(Graphics g){   //描写処理
 58:    th.paint(g);                   //back()のpaintを呼び出し
 59:    g.drawImage(i,x,60,this);      //画像張り付け
 60:    g.drawImage(m,y,130,this);
 61:    }
 62:    
 63:    public void actionPerformed(ActionEvent e){    //イベント処理(ボタンを押した)
 64:    if(e.getSource()==acz){sp1=9;}     
 65:    else if(e.getSource()==acx){sp2=8;}
 66:    else if(e.getSource()==brz){sp1=4;}
 67:    else if(e.getSource()==brx){sp2=6;}
 68:    else if(e.getSource()==engz){sp1=1;}
 69:    else if(e.getSource()==engx){sp2=1;}
 70:    }
 71:    public void update(Graphics g){
 72:    paint(g);
 73:    }
 74:    int w;
 75:    public void run(){     //threadの処理
 76:    while(true){                //無限ループ
 77:        x=x+sp1;                
 78:        y=y+sp2;
 79:        if(x>w){x=0;}
 80:        if(y>w){y=0;}
 81:        repaint();
 82:        try{Thread.sleep(100);
 83:        }catch (InterruptedException e){
 84:        }
 85:    }
 86:    }
 87:    
 88:}



back.java :背景を描写するプログラム
[j03040:java/rep#8/kan] j03040% java List back.java
File name:back.java
 1:import java.applet.*;
 2:import java.awt.*;
 3:
 4:public class back extends Thread{       //Threadを継承
 5:    int x=0;
 6:   
 7:    public synchronized void paint(Graphics g){   //描写処理
 8:     g.setColor(Color.lightGray);     //色を指定
 9:        g.fillRect(0,0,500,200);      //四角形(道路)を描写
 10:    g.setColor(Color.white);          
 11:    for(int i=1000;i>0;i-=90){       //四角形(中央線)を描写
 12:        g.fillRect(i-x,120,50,10);
 13:    }
 14:    g.setColor(Color.blue);
 15:    g.fillRect(0,0,500,50);          //四角形(空)を描写
 16:    g.setColor(Color.white);
 17:    g.fillRect(0,200,500,110);      
 18:    g.setColor(Color.gray);
 19:    g.fillRect(250,200,250,110);
 20:    x+=10;
 21:    if(x>500)x=0;
 22:    }
 23:    
 24:    public void run(){
 25:        while(true){
 26:            try{
 27:                Thread.sleep(200);
 28:            }catch(Exception ex){
 29:            }
 30:        }
 31:    }
 32:}



○実行結果ーーーーーーー→ココ




○感想・反省
最初はバイクをスレッドにしてそれぞれ別々に処理したかったけど
スレッドを継承しているクラスだとdrawImageが使えませんでした。
そこで、アプレットを継承してランブルを実装したら、表示できたけど
一つにまとめようとするとエラーが怒ってどうしようもなかったので
最終的には背景とバイクで分けました。
どうしてエラーが怒ったのか最後まで分からなかったのがとても残念です。

学期末と言う事もあってあまり時間をかけれませんでした。




○参考文献 http://msugai.fc2web.com/java/
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html
http://www2s.biglobe.ne.jp/~yuuki_ki/index.htm