波紋が広がる簡単なアプレット
アプレットプログラムのレポートツールでの作成方法はreportのページを参照。
javaコンソールを開くと下記の
プログラムのSystem.out.printlnの書き出しを見ることができ
IE等のブラウザーの操作でどのようなメソッが呼ばれるか確認できる。
(javaコンソールの開き方)
ソースコード:TestApplet2.java
HTMLのソースコード:TestApplet2.html
import java.applet.Applet;
import java.awt.*;
public class TestApplet2 extends Applet implements Runnable
{
Wave waveList[]=null;
//次の2変数は複数のスレッドから同時に参照される可能性があるのでvolatile修飾子を付けた
//volatile修飾子:
// 複数のスレッドから参照されるので、変数の一時コピーを作るなどの最適化を抑制する
volatile Thread thread=null;//別スレッドの実行フラグとして使う
volatile boolean paintOK=false;//描画準備完了か?
//
public TestApplet2()
{
System.out.println("コンストラクタTestApplet2()");System.out.flush();//フラッシュ必要
}
public void init()
{
System.out.println("init()");System.out.flush();
initWave();
}
public void destroy()
{
System.out.println("destroy()");System.out.flush();
//上書きする必要はない
}
void initWave()//描画のための準備を行う初期化
{
System.out.println("initWave()");System.out.flush();
//描画画面の用意ができるのをまつ。
Dimension dim=null;//画面の大きさ
//画面の大きさが決まるまでループして待つ
while(dim==null){
dim=getSize();
try{
Thread.sleep(30);//0.03秒休む
}catch(Exception e){/*例外でも何もしない*/}
}
//画面の設定と波紋の準備
setBackground(Color.white);//背景は白に
dim=getSize();
waveList=new Wave[(dim.width*dim.height)/5000];
for(int i=0;i<waveList.length;i++)
waveList[i]=new Wave(dim.width,dim.height);//各Waveを生成
//描画準備完了のフラグを立てる
paintOK=true;
}
//start、stopでThreadを制御
public void start()
{
System.out.println("start()");System.out.flush();
if(thread==null){
thread=new Thread(this);
thread.start();
}
}
public void stop()
{
System.out.println("stop()");System.out.flush();
thread=null;
}
public void run()
{
System.out.println("run()");System.out.flush();
//実行中の無限ループ
while(thread!=null){
for(int i=0;i<waveList.length;i++)
waveList[i].next();//各Waveを更新
repaint();//再描画
try{
Thread.sleep(30);//0.03秒休む
}catch(Exception e){/*例外でも何もしない*/}
}
}
//描画関連
public void paint(Graphics g)
{
if(paintOK){//画面が用意できていれば描画
for(int i=0;i<waveList.length;i++)
waveList[i].paint(g);//各Waveを描画
}else{
//時間が短いので、おそらく見ることは無いだろうが用心して書いておく
g.drawString("準備中ですしばらくお待ちください",10,20);
}
}
}
/*波紋のクラス*/
class Wave
{
//波の色を予め準備
static final int RMAX=64;
static Color clist[]=null;
static{
clist=new Color[RMAX+1];
double k=240.0/RMAX;
int t;
for(int i=0;i<=RMAX;i++){
t=(int)(i*k);
clist[i]=new Color(t,t,240);
}
}
//インスタンスのメンバ
int width=100,
height=100,
x=0,//波の中心のx座標
y=0,//波の中心のy座標
r=0;//波の半径
Wave(int w,int h)
{
width=w; height=h;
x=(int)(Math.random()*width);
y=(int)(Math.random()*height);
r=0;
}
void next()
{
if(r==0){
if(0.995<Math.random())r=1;
}else if(r==RMAX){
x=(int)(Math.random()*width);
y=(int)(Math.random()*height);
r=0;
}else r++;
}
void paint(Graphics g)
{
if(r==0)return;
g.setColor(clist[r]);
g.drawOval(x-2*r,y-2*r,4*r,4*r);
}
}