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クラスへ