ストップウォッチを付けてみる。
ちょっと不安定な感じが何かと鬱。
アラーム纏めるのはまた今度。
ソース
//clock Ver2.8
//Last update:2002.12.20
/**/
import java.awt.*;
import java.applet.*;
import java.util.Date;
import java.net.*;
public class clock extends Applet implements Runnable
{
Panel but,rdo;
Image fb;
Graphics gg;
int k=0;
int dt=1000;
int w=100,h=100;
int b,mc=0;
double sa,ma,ha;
int sl=80,ml=80,hl=60;
int hi,di,wi,ai,aci;
int chk=0;
int moji=-1,moji2=-1,moji3=59;
int dig_x=0,dig_y=200;
int ara_h1=0,ara_h2=0,ara_m1=0,ara_m2=0,ara_s1=0,ara_s2=0;
int half;
int res=0;
boolean show=false;
boolean bg1=true,bg2=false,bg3=false;
boolean ah0=true,ah1=false,ah2=false;
boolean ah20=true,ah21=false,ah22=false,ah23=false,ah24=false,ah25=false,ah26=false,ah27=false,ah28=false,ah29=false;
boolean am0=true,am1=false,am2=false,am3=false,am4=false,am5=false;
boolean am20=true,am21=false,am22=false,am23=false,am24=false,am25=false,am26=false,am27=false,am28=false,am29=false;
boolean as0=true,as1=false,as2=false,as3=false,as4=false,as5=false;
boolean as20=true,as21=false,as22=false,as23=false,as24=false,as25=false,as26=false,as27=false,as28=false,as29=false;
boolean onoff=false;
boolean load=false;
Image img[]=new Image[3];
Image dnum[]=new Image[14];
Image dwek[]=new Image[8];
Image aram[]=new Image[14];
Image hai,on,off;
AudioClip sou[]=new AudioClip[4];
AudioClip mel,ara;
MediaTracker mt;
final double RAD=Math.PI/180.0;
final String STATUSTEXT = "Clock Ver2.8";
/*円の中心の座標*/
int cen_y ,cen_x;
/*円の半径*/
int r;
/*文字盤の数字と目盛りの配置角度*/
double fon_an, sca_an;
/*時計に表示する数字の位置座標*/
double fon_x[] , fon_y[];
/*時計に表示する目盛りの位置座標*/
double sca_x1[] , sca_y1[] , sca_x2[] , sca_y2[];
/*数字と目盛りの角度のラジアン値*/
double fon_ra, sca_ra;
Thread th;
/************************************************************************************/
public void init()
{
/*円の半径*/
r=80;
cen_x=w;
cen_y=h;
/*数字と目盛りの書き始め*/
fon_an=90.0;
sca_an=90.0;
/*数字と目盛りの位置座標を初期化*/
fon_x=new double[12];
fon_y=new double[12];
sca_x1=new double[60];
sca_y1=new double[60];
sca_x2=new double[60];
sca_y2=new double[60];
/*数字を配置するループ文*/
for(int i=11;i>=0;i--)
{
/*数字の配置角度をラジアンに変換*/
fon_ra=fon_an*Math.PI/180;
/*数字を順番に格納*/
fon_x[i]=(cen_x+Math.cos(fon_ra)*r*0.9)-r*0.08;
fon_y[i]=(cen_y-Math.sin(fon_ra)*r*0.9)+r*0.08;
/*数字の配置角度*/
fon_an+=30.0;
}
/*同様に目盛りのループ文*/
for(int i=59; i>=0; i--)
{
sca_ra=sca_an*Math.PI/180;
sca_x1[i]=cen_x+Math.cos(sca_ra)*r;
sca_y1[i]=cen_y+Math.sin(sca_ra)*r;
sca_x2[i]=cen_x+Math.cos(sca_ra)*r*1.05;
sca_y2[i]=cen_y+Math.sin(sca_ra)*r*1.05;
sca_an+=6.0;
}
fb=createImage(300,300);
gg=fb.getGraphics();
/*画像及びサウンドファイルの取得*/
for(hi=0;hi<3;hi++)
{
img[hi]=getImage(getCodeBase(),"hai"+hi+".gif");
}
on=getImage(getCodeBase(),"on.gif");
off=getImage(getCodeBase(),"off.gif");
mel=getAudioClip(getCodeBase(),"clockwork.au");
ara=getAudioClip(getCodeBase(),"ara.au");
for(di=0;di<14;di++)
{
dnum[di]=getImage(getCodeBase(),"dig_num"+di+".gif");
gg.drawImage(dnum[di],0,200,this);
}
for(wi=0;wi<8;wi++)
{
dwek[wi]=getImage(getCodeBase(),"dig_wek"+wi+".gif");
gg.drawImage(dwek[wi],0,200,this);
}
for(ai=0;ai<14;ai++)
{
aram[ai]=getImage(getCodeBase(),"aram"+ai+".gif");
gg.drawImage(aram[ai],0,228,this);
}
for(aci=0;aci<4;aci++)
{
sou[aci]=getAudioClip(getCodeBase(),"se"+aci+".au");
}
/*メディアトラッカーを設定*/
mt=new MediaTracker(this);
for (int hi=0;hi<3;hi++)
{
mt.addImage(img[hi],3);
}
for (int di=0;di<14;di++)
{
mt.addImage(dnum[di],(14+3));
}
for (int wi=0;wi<8;wi++)
{
mt.addImage(dwek[wi],(8+14+3));
}
for (int ai=0;ai<14;ai++)
{
mt.addImage(aram[ai],(14+8+14+3));
}
mt.addImage(on, (1+14+8+14+3));
mt.addImage(off, (1+1+14+8+14+3));
/*ボタン、パネルの設置*/
Button b1=new Button("中断");
Button b2=new Button("再開");
Button b3=new Button("初期化");
Button b4=new Button(" > ");
Button b5=new Button(" − ");
but=new Panel();
but.setLayout(new FlowLayout(FlowLayout.LEFT));
but.add(b1);
but.add(b2);
but.add(b3);
but.add(b4);
but.add(b5);
CheckboxGroup ckg=new CheckboxGroup();
rdo=new Panel();
rdo.setLayout(new GridLayout(2,1));
rdo.add(new Checkbox ("Clock",ckg,true));
rdo.add(new Checkbox ("S.W",ckg,false));
setBackground(Color.white);
setLayout(new BorderLayout());
add("South",but);
add("East",rdo);
}
/************************************************************************************/
public void start()
{
th = new Thread(this);
th.start();
}
/************************************************************************************/
public boolean action(Event e,Object o)
{
if(e.target instanceof Button)
{
String s=(String)o;
if(s=="中断")
th.suspend();
else if(s=="再開")
th.resume();
else if(s=="初期化")
k=0;
else if(s==" > ")
mel.loop();
else if(s==" − ")
mel.stop();
return true;
}
if(e.target instanceof Checkbox)
{
String str=((Checkbox)e.target).getLabel();
if("Clock".equals(str))
{
chk=0;
sou[3].play();
}
else if("S.W".equals(str))
{
if(res==0)
{
chk=1;
k=0;
res=1;
sou[3].play();
}
else if(res==1)
{
chk=1;
sou[3].play();
}
}
}
return false;
}
/************************************************************************************/
/*マウスをクリックした時の動作*/
public boolean mouseDown(Event evt,int x,int y)
{
if(dig_x3)
{
if(ah0)
{
ara_h2=1;
ah1=true;
ah0=false;
}
else if(ah1)
{
ara_h2=0;
ah0=true;
ah1=false;
}
}
else
{
if(ah0)
{
ara_h2=1;
ah1=true;
ah0=false;
}
else if(ah1)
{
ara_h2=2;
ah2=true;
ah1=false;
}
else if(ah2)
{
ara_h2=0;
ah0=true;
ah2=false;
}
}
repaint();
}
if(1512)half=half-12;
if(half==0)half=12;
if(min==0)
{
if(sec=0; i--)
{
gg.setColor(c3);
if((i+1)%5==0)
gg.fillOval((int)(sca_x2[i]-2),(int)(sca_y2[i]-2),5,5);
else
gg.drawLine((int)sca_x1[i],(int)sca_y1[i] ,
(int)sca_x2[i] , (int)sca_y2[i]);
}
/* 同様に数字を描画*/
for(int i=moji; i>=0; i--)
{
gg.setColor(c1);
String s;
if((i+1)==6)
s=" "+(i+1);
else
s=""+(i+1);
gg.drawString(s, (int)fon_x[i] , (int)fon_y[i]);
}
/*もう一つの目盛りを描画*/
for(int i=moji3; i>=0; i--)
{
gg.setColor(c2);
if((i+1)%5==0)
gg.drawLine((int)sca_x1[i],(int)sca_y1[i] ,
(int)sca_x2[i],(int)sca_y2[i]);
}
/*針の角度*/
if(chk==0)
{
sa=90-sec*6;
ma=90-min*6;
ha=90-hou*30-min/2;
int xp[]=new int[4];
int yp[]=new int[4];
/*時針*/
xp[0]=cen_x;
yp[0]=cen_y;
xp[1]=(int)((hl-10)*Math.cos(RAD*(ha-10))+cen_x);
yp[1]=(int)(cen_y-(hl-10)*Math.sin(RAD*(ha-10)));
xp[2]=(int)(hl*Math.cos(RAD*ha)+cen_x);
yp[2]=(int)(cen_y-hl*Math.sin(RAD*ha));
xp[3]=(int)((hl-10)*Math.cos(RAD*(ha+10))+cen_x);
yp[3]=(int)(cen_y-(hl-10)*Math.sin(RAD*(ha+10)));
gg.setColor(c6);
gg.fillPolygon(xp,yp,4);
gg.setColor(c7);
gg.drawPolygon(xp,yp,4);
/*分針*/
xp[0]=cen_x;
yp[0]=cen_y;
xp[1]=(int)((ml-10)*Math.cos(RAD*(ma-5))+cen_x);
yp[1]=(int)(cen_y-(ml-10)*Math.sin(RAD*(ma-5)));
xp[2]=(int)(ml*Math.cos(RAD*ma)+cen_x);
yp[2]=(int)(cen_y-ml*Math.sin(RAD*ma));
xp[3]=(int)((ml-10)*Math.cos(RAD*(ma+5))+cen_x);
yp[3]=(int)(cen_y-(ml-10)*Math.sin(RAD*(ma+5)));
gg.setColor(c4);
gg.fillPolygon(xp,yp,4);
gg.setColor(c5);
gg.drawPolygon(xp,yp,4);
gg.setColor(c8);
gg.fillOval(cen_x-2,cen_y-2,5,5);
gg.setColor(Color.white);
gg.fillOval(cen_x,cen_y,1,1);
/*秒針*/
xp[0]=(int)(sl*Math.cos(RAD*sa)+cen_x);
yp[0]=(int)(cen_y-sl*Math.sin(RAD*sa));
xp[1]=(int)(cen_x-10*Math.cos(RAD*sa));
yp[1]=(int)(10*Math.sin(RAD*sa)+cen_y);
gg.drawLine(cen_x,cen_y,xp[0],yp[0]);
gg.drawLine(cen_x,cen_y,xp[1],yp[1]);
}
/*S.W*/
else if(chk==1)
{
/*時針*/
gg.setColor(c4);
hh=(double)k/3600.0;
mm=(double)((k/60)%60);
v=db*(double)k/3600.0;
ss2=Math.sin(v);
cc2=Math.cos(v);
ss3=Math.cos(v);
cc3=Math.sin(v);
x2=100+(int)(rrrr*ss2);
y2=100-(int)(rrrr*cc2);
x4=((int)(rr*ss3))/4;
y4=((int)(rr*cc3))/4;
int[] x6=new int[]{100+x4,100-x4,x2}; // X 座標のセット
int[] y6=new int[]{100+y4,100-y4,y2}; // Y 座標のセット
gg.fillPolygon(x6,y6,3);
/*分針*/
gg.setColor(c6);
u=da*mm;
ss2=Math.sin(u);
cc2=Math.cos(u);
ss3=Math.cos(u);
cc3=Math.sin(u);
x2=100+(int)(rrr*ss2);
y2=100-(int)(rrr*cc2);
x4=((int)(rr*ss3))/5;
y4=((int)(rr*cc3))/5;
int[] x5=new int[]{100+x4,100-x4,x2}; // X 座標のセット
int[] y5=new int[]{100+y4,100-y4,y2}; // Y 座標のセット
gg.fillPolygon(x5,y5,3);
/*秒針*/
gg.setColor(c3);
t=da*(double)(k%60);
ss2=Math.sin(t);
cc2=Math.cos(t);
x2=100+(int)(r*ss2);
y2=100-(int)(r*cc2);
x3=100-(int)(rr*ss2);
y3=100+(int)(rr*cc2);
gg.drawLine(x3,y3,x2,y2);
}
/*デジタル時計*/
mon2=(int)((mon+1)/10);
mon1=(int)((mon+1)%10);
day2=(int)(day/10);
day1=(int)(day%10);
hou2=(int)hou/10;
hou1=(int)hou%10;
min2=(int)min/10;
min1=(int)min%10;
sec2=(int)sec/10;
sec1=(int)sec%10;
if(show)
{
gg.drawImage(dnum[mon2],0,200,this);
gg.drawImage(dnum[mon1],22,200,this);
gg.drawImage(dwek[7],44,200,this);
gg.drawImage(dnum[day2],55,200,this);
gg.drawImage(dnum[day1],77,200,this);
gg.drawImage(dwek[7],99,200,this);
gg.drawImage(dwek[wek],110,200,this);
}
else
{
gg.drawImage(dnum[hou2],0,200,this);
gg.drawImage(dnum[hou1],22,200,this);
gg.drawImage(dnum[10],44,200,this);
gg.drawImage(dnum[min2],55,200,this);
gg.drawImage(dnum[min1],77,200,this);
gg.drawImage(dnum[10],99,200,this);
gg.drawImage(dnum[sec2],110,200,this);
gg.drawImage(dnum[sec1],132,200,this);
}
/*アラーム*/
gg.drawImage(aram[ara_h2],0,240,this);
gg.drawImage(aram[ara_h1],15,240,this);
gg.drawImage(aram[10],30,240,this);
gg.drawImage(aram[ara_m2],40,240,this);
gg.drawImage(aram[ara_m1],55,240,this);
gg.drawImage(aram[10],70,240,this);
gg.drawImage(aram[ara_s2],80,240,this);
gg.drawImage(aram[ara_s1],95,240,this);
if(onoff)
{
if(ara_h2==hou2)
{
if(ara_h1==hou1)
{
if(ara_m2==min2)
{
if(ara_m1==min1)
{
if(ara_s2==sec2)
{
if(ara_s1==sec1)
{
ara.loop();
}
}
}
}
}
}
}
if(!onoff)
{
gg.drawImage(off,110,240,this);
}
else gg.drawImage(on,110,240,this);
g.drawImage(fb,0,0,this);
}
else
{
g.clearRect(0,0,300,300);
g.setColor(Color.black);
g.setFont(new Font("TimesRoman",Font.BOLD,12));
g.drawString("Now Loading...",10,20);
g.setFont(new Font("Dialog",Font.BOLD,12));
g.drawString("訳「ちょっと待て」",10,50);
}
}
/************************************************************************************/
public void update(Graphics g)
{
paint(g);
}
/************************************************************************************/
public void stop()
{
th.stop();
th=null;
}
}