/**********************************************************************************
* *
* チェックボックスのアプレット *
* ( CheckBox.java ) *
* Author : Seiichi Inoue *
**********************************************************************************/
/******************** << インポートパッケージクラス定義 >> ******************/
import java.applet.Applet; /* Appletパッケージ */
import java.awt.*; /* Abstract Windowing Toolkitパッケージの全て*/
import java.lang.Math; /* Mathパッケージ */
/************************ << 自分のクラス定義 >> ****************************/
// クラス名称 : CheckBox
// アクセス制御 : public(どのクラスからもアクセス可能)
// 継承クラス : Applet
// 引継クラス : Runnable
// 入力パラメータ: NANE="r" (半径)
// NAME="node" (ノード数)
public class CheckBox extends Applet implements Runnable {
/************************** << クラス変数属性の宣言 >> **********************/
Thread kicker=null; /* スレッド制御(初期値:停止) */
Dimension d; /* 表示領域 */
Image offs; /* オフスクリーンエリア */
Graphics grf; /* 描画領域 */
String param; /* パラメータ引き取り */
int r; /* 描画半径 */
int n; /* ノード数 */
int x; /* 描画オフセット(横軸) */
int y; /* 描画オフセット(縦軸) */
int k; /* 線の引き始め位置カウンタ */
int x1; /* 線の引き始め横軸(x)座標 */
int y1; /* 線の引き始め縦軸(y)座標 */
int j; /* 線の引き終わり位置カウンタ */
int x2; /* 線の引き終わり横軸(x)座標 */
int y2; /* 線の引き終わり縦軸(y)座標 */
/******************** << クラスのメッソード指定(実行手順) >> **************/
/*********** 初期化(init)メッソード ***********/
public void init() {
d = size(); /* 表示画面サイズ情報を設定 */
offs = createImage(d.width,d.height); /* オフスクリーン用表示エリア作成 */
grf = offs.getGraphics(); /* グラヒックオブジェクト取得 */
grf.setColor(Color.white); /* 背景色設定(白) */
grf.fillRect(0,0,d.width,d.height); /* 背景色塗りつぶし */
param = getParameter("r"); /* 半径パラメータ取込 */
r = (param != null)? /* 入力判定(無指定時:100ピクセル)*/
Integer.parseInt(param): 100;
param = getParameter("node"); /* ノード数パラメータ取込 */
n = (param != null)? /* 入力判定(無指定時:16ノード) */
Integer.parseInt(param): 16;
setLayout(new BorderLayout()); /* ボーダーレイアウト設定 */
Panel p = new Panel(); /* パネルインスタンス設定 */
p.setBackground(Color.yellow); /* パネルの背景色を設定 */
p.setLayout(new GridLayout(1,8)); /* チェックボタンをグリッドに配置 */
CheckboxGroup cg = new CheckboxGroup(); /* チェックボックスグループ設定 */
p.add(new Checkbox("red",cg,true)); /* 赤色チェックボタン(初期値) */
p.add(new Checkbox("pink",cg,false)); /* ピンク色チェックボタン */
p.add(new Checkbox("orange",cg,false)); /* オレンジ色チェックボタン */
p.add(new Checkbox("yellow",cg,false)); /* 黄色チェックボタン */
p.add(new Checkbox("green",cg,false)); /* 緑色チェックボタン */
p.add(new Checkbox("cyan",cg,false)); /* 水色チェックボタン */
p.add(new Checkbox("blue",cg,false)); /* 青色チェックボタン */
p.add(new Checkbox("gray",cg,false)); /* 灰色チェックボタン */
add("South",p); /* パネルを下部に設定 */
grf.setColor( Color.red ); /* 初期色(赤)設定 */
} /* 初期化メソッド終了 */
/******** アクション(action)メソッド *********/
public boolean action(Event e,Object o) {
Checkbox c = (Checkbox)e.target; /* クリックされたオブジェクト取得 */
if ("red".equals(c.getLabel())) /* 赤色ボックス? */
grf.setColor( Color.red ); /* 赤色設定 */
else if ("pink".equals(c.getLabel())) /* ピンク色ボックス? */
grf.setColor( Color.pink ); /* ピンク色設定 */
else if ("orange".equals(c.getLabel())) /* オレンジ色ボックス? */
grf.setColor( Color.orange ); /* オレンジ色設定 */
else if ("yellow".equals(c.getLabel())) /* 黄色ボックス? */
grf.setColor( Color.yellow ); /* 黄色設定 */
else if ("green".equals(c.getLabel())) /* 緑色ボックス? */
grf.setColor( Color.green ); /* 緑色設定 */
else if ("cyan".equals(c.getLabel())) /* 水色ボックス? */
grf.setColor( Color.cyan ); /* 水色設定 */
else if ("blue".equals(c.getLabel())) /* 青色ボックス? */
grf.setColor( Color.blue ); /* 青色設定 */
else if ("gray".equals(c.getLabel())) /* 灰色ボックス? */
grf.setColor( Color.gray ); /* 灰色設定 */
else /* どの色でもない? */
grf.setColor( Color.black ); /* 黒色設定 */
return true;
} /* アクションメソッド終了 */
/********** スタート(start)メソッド **********/
public void start() {
if ( kicker == null ) { /* kickerがnull?(停止中?) */
kicker = new Thread(this); /* YES:kickerを動作中に設定 */
kicker.start(); /* startを設定 */
}
} /* スタートメソッド終了 */
/*********** 繰り返し(run)メソッド ***********/
public void run() {
Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3);
while( kicker != null) { /* kickerがnullになるまで繰り返し */
try { /* 割り込み確認 */
double rd=3.14159/180; /* 角度値を64ビット値とする */
for ( k=0; k<=n-2; k++ ) { /* 線の描画開始座標計算 */
x1 = (int) ( r*Math.cos( k*360/n*rd ) + r ); /* 開始 x 座標 */
y1 = (int) ( r*Math.sin( k*360/n*rd ) + r ); /* 開始 y 座標 */
x = ( d.width - r*2 )/2; /* 描画オフセット(横)計算 */
if ( x <= 0 ) /* オフセット判定(負?) */
x = 0; /* YES:ゼロ設定 */
x1 += x; /* 開始座標オフセット(横)加算 */
y = ( d.height - r*2 )/2; /* 描画オフセット(縦)計算 */
if ( y <= 0 ) /* オフセット判定(負?) */
y = 0; /* YES:ゼロ設定 */
y1 += y; /* 開始座標オフセット(縦)加算 */
for ( j=k+1; j<=n-1; j++ ) {/* 線の描画終了座標計算 */
x2 = (int) ( r*Math.cos( j*360/n*rd ) + r );/* 終了 x 座標*/
y2 = (int) ( r*Math.sin( j*360/n*rd ) + r );/* 終了 y 座標*/
x2 += x; /* 終了点オフセット(横)加算 */
y2 += y; /* 終了点オフセット(縦)加算 */
kicker.sleep(20); /* 線描画待ち合わせ(20mSEC) */
repaint(); /* 描画メソッド呼び出し */
}
}
} catch(InterruptedException e) {} /* 割り込み処理 */
}
kicker = null; /* 繰り返し処理終了設定 */
} /* 繰り返しメソッド終了 */
/************ 更新(update)メソッド ***********/
public void update(Graphics g) { /* 画面のちらつきを無くす */
paint(g); /* 描画 */
} /* 更新メソッド終了 */
/************ 描画(paint)メソッド ************/
public void paint(Graphics g) {
grf.drawLine( x1,y1,x2,y2 ); /* 線の描画 */
g.drawImage(offs,0,0,this); /* 描画設定 */
}
/********** ストップ(stop)メソッド *********/
public void stop() {
if( kicker != null ) { /* kickerがnullでない?(動作中?) */
kicker.stop(); /* kickerを停止に設定 */
kicker = null; /* kickerに停止状態を設定 */
}
} /* ストップメソッド終了 */
} /* クラス設定終了 */
/**********************************************************************************
* チェックボックスのアプレット終了 *
**********************************************************************************/