Kadaiクラスの説明

概要

このクラスはAppletを継承しており、ActionListenerインターフェイスをインプリメントしている。
ボタンやテキストフィールドなどのGUI部品の作成・初期化・をinit()メソッドで行い、ボタンを押したときのイベント処理をactionPerformed(ActionEvent e)で行う。イベント処理にはスレッドを使っているので、run()メソッドも含まれている。

クラスの階層図

java.lang.Object
   |
   +--java.awt.Component
         |
         +--java.awt.Container
               |
               +--java.awt.Panel
                     |
                     +--java.applet.Applet
                           |
                           +--Kadai

GUI部品について

GUI(Graphical User Interface)部品とは、ボタンやラベル、スクロールバーなどのグラフィカルなユーザーインターフェイスのことである。
GUI部品には以下の種類がある。
GUI部品クラス 機能
Button ボタン
Checkbox チェックボックス
Choice 選択ボックス
Label ラベル
List リストボックス
Scrollbar スクロールバー
TextArea 複数行テキストボックス
TextField 単一行テキストボックス
このうち、今回はボタンとテキストフィールドを使っている。
定義している変数

b1,b2,b3
ボタン。b1は開始(中止)ボタン、b2はμを変更する時用のボタン、b3はグラフをクリアするためのボタン。

tf1
テキストフィールド。μを入力するのに使っている。

c1
myCanvasクラス。球が滑り降りるグラフィックを描画するためのキャンバス。

c2
graphCanvasクラス。球に関しての時間-X座標のグラフを描画するためのキャンバス。

sm
Simクラス。玉の動きのシミュレーションを行う。

flag1
論理型の変数。開始ボタンを中止にするためのフラグとして使っている。
・initメソッド

GUI部品の作成と初期化、設置を行う。

sm=new Sim(0.0,0.0,0.0);
smのコンストラクタを座標・速さをすべて0で呼び出して、初期化を行う。

b1=new Button("開始");
b1.addActionListener(this);
add(b1);
ボタン1をb1で指定できるようにしている。また、イベント処理に対応できるようにもしている。

tf1=new TextField(10);
add(tf1);
tf1.setText("0.3");
10文字の大きさのテキストフィールドをtf1で指定できるようにする。
最初のμの値を0.3にしているので、分かりやすいように最初から0.3が表示されるようにしてある。

b2=new Button("μを変更");
b2.addActionListener(this);
add(b2);
ボタン2をb2で指定できるようにする。ラベル以外はb1とほとんど同じ。

c1=new myCanvas();
c1.setSize(300,200);
c1.setBackground(Color.white);
add(c1);
グラフィックを描画するキャンバスをc1で指定できるようにする。
サイズは300×200で背景は白色。

c2=new graphCanvas(); 
c2.setSize(300,300);
c2.setBackground(Color.white);
add(c2);
グラフを描画するキャンバスをc2で指定できるようにする。
サイズは300×300で背景はこれも白色。

b3=new Button("クリア");
b3.addActionListener(this);
add(b3);
ボタン3をb3で指定できるようにする。これもラベル以外はb1とほとんど同じ。
・actionPerformedメソッド

if((e.getSource()==b1)&&(flag1)){ 
    Thread t1=new Thread(this);
    flag1=false;
    b1.setLabel("中止"); 
    t1.start();
}
ボタン1が押された時のイベント処理(1)。
まだボタンが押されていない(シミュレーションが行われていない)状態の時にボタン1を押すとこの部分が実行される。
flag1は最初trueが入っているので、初めてボタンを押すときはここが実行されることになる。
シミュレーションのループはスレッドを利用しているので、外部にある。
シミュレーションが始まると同時に、ボタンのラベルを「中止」に変更し、flag1をfalseにして、実行中であるというフラグを立てる。

else if((e.getSource()==b1)&&!(flag1)){
    flag1=true;
}
実行中フラグが立っている時にボタンを押された時の処理。
flag1はシミュレーションの繰り返し条件に使われているので、これをfalseにすることでループを抜けるようにしている。
ループを抜けるとボタンのラベルは「開始」に戻るので、最初の状態とほとんど同じになる。

else if(e.getSource()==b2){ 
    sm.setMyu((new Double(tf1.getText())).doubleValue());
}
ボタン2を押したときの処理。
テキストフィールド内の文字列をdouble型に変更して、sm.setMyuメソッドに引数として渡す。
これでμの値をテキストフィールド内の値に変更することができる。

else if(e.getSource()==b3){
    c2.clear();
}
ボタン3を押したときの処理。
c2.clearを呼び出して、グラフの中身を消す。
・runメソッド

sm.init(0.0,0.0,0.0);
開始を押すたびにシミュレーションの変数は初期化しなければいけないので、ここで行っている。

do{
    t=t+dt;
    sm.one_step(dt);
    c1.draw();
    c1.drawBall(sm.px,sm.py);
    c2.drawPoint(t*10,sm.px*0.8);
    for(i=0;i<100000;i++);
}while((sm.px<265)&&(sm.px>-265)&&(sm.v!=0)&&!(flag1));
シミュレーションのためのループ。
dtはオイラー法に使う微小時間。
tはグラフのX軸に使うためにdtの累計を求めている。
c1.draw、c1.drawBall、c2.drawPointは球とグラフの描画を行うメソッド。
drawPointの引数が10倍や0.8倍されているのは、画面内にちょうどいいサイズに調節するためのもの。
for文は時間稼ぎ。
このループの終了条件は球のX座標が画面に表示しきれない領域になったり、速度が0(摩擦係数が大きすぎて動かない)の時に次の動作に移る事ができるようにするためのものである。
条件にflag1がfalseである、というものがあるが、これによってボタン1を動作中に押すとループを抜けると言う処理を実現している。

flag1=true;
b1.setLabel("開始");
ループを抜けたら、またシミュレーションが行える状態に戻すようにしてある。
flagは動作終了しているのでtrueに、ボタンのラベルは「開始」に戻る。
戻る   myCanvasクラスへ