問題描述:
是壹個這樣的倒計時鐘:輸入壹個時間 比如120分鐘 按開始後 倒計時開始.在中途可以選擇暫停.在剩下1分鐘時會有提示.
要用application編寫的哦.麻煩各位高手了.
解析:
package hello;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;
import java.awt.geom.*;
public class T extends Applet implements Runnable{
Thread tHour = null,tMinute = null,tSecond = null;表示時針,分針和秒針的線程
int hour_a,hour_b,minute_a,minute_b,second_a,second_b;表示時針,分針,秒針端點的整型變量
int hour = 0,minute = 0,second = 0;獲取當前時間的整型變量
繪制時針,分針和秒針的Graphics對象
Graphics g_second = null,g_minute = null,g_hour =null;
存放表盤刻度的數組,供指針走動時使用
double point_x[] = new double[61],point_y[] = new double[61];
存放表盤刻度的數組,供繪制表盤使用
double scaled_x[] = new double[61],scaled_y[] = new double[61];
判斷小程序是否重新開始的變量
int start_count = 0;
public void init(){
g_hour = this.getGraphics();
g_hour.setColor(Color.CYAN);
g_second = this.getGraphics();
g_second.setColor(Color.RED);
g_minute = this.getGraphics();
g_minute.setColor(Color.blue);
g_second.translate(200,200);進行坐標系統變換,將新坐標系原點設在(200,200)處
g_minute.translate(200,200);
g_hour.translate(200,200);
point_x[0] = 0; point_y[0] = -120;各個時針12點處的位置坐標(按新坐標系的坐標)
scaled_x[0] = 0;scaled_y[0] = -140;12點處的刻度位置坐標(按新坐標系的坐標)
double jiaodu = 6*Math.PI/180;
表盤分割成60分,將分割點的坐標存放在數組中
for(int i = 0; i < 60; i++){
point_x[i+1] = point_x[i]*Math.cos(jiaodu)-Math.sin(jiaodu)*point_y[i];
point_y[i+1] = point_y[i]*Math.cos(jiaodu) + point_x[i]*Math.sin(jiaodu);
}
point_x[60] = 0; point_y[60] = -120;
for(int i = 0; i < 60; i++){
scaled_x[i+1] = scaled_x[i]*Math.cos(jiaodu)-Math.sin(jiaodu)*scaled_y[i];
scaled_y[i+1] = scaled_y[i]*Math.cos(jiaodu) + Math.sin(jiaodu)*scaled_x[i];
}
scaled_x[60]= 0;
scaled_y[60] = -140;
}
public void start(){
每當小程序重新開始時,首先消滅線程,然後重新開始創建線程
if(start_count >= 1){
tSecond.interrupt();
tMinute.interrupt();
tHour.interrupt();
}
tSecond = new Thread(this);
tMinute = new Thread(this);
tHour = new Thread(this);
tSecond.start();
tMinute.start();
tHour.start();
start_count++;
if(start_count >= 2) start_count = 1;
}
public void stop()
{
tSecond.interrupt();
tMinute.interrupt();
tHour.interrupt();
}
public void paint(Graphics g){
this.start();
g.drawOval(50,50,300,300);表盤的外圈
g.translate(200,200);
繪制表盤的小刻度和大刻度
for(int i = 0 ; i < 60; i++){
if(i%5 == 0){
g.setColor(Color.BLACK);
g.fillOval((int) scaled_x[i],(int) scaled_y[i],10,10);
}
else
g.fillOval((int)scaled_x[i],(int)scaled_y[i],5,5);
}
}
public void run(){
獲取本地時間
Date date = new Date();
String s=date.toString();
hour=Integer.parseInt(s.substring(11,13));
minute = Integer.parseInt(s.substring(14,16));
second = Integer.parseInt(s.substring(17,19));
if(Thread.currentThread() == tSecond){
second_a =(int)point_x[second];
second_b = (int)point_x[second];
g_second.drawLine(0,0,second_a,second_b);秒針的初始位置
g_second.drawString("秒",second_a,second_b);
int i = second;
while(true){
try{
tSecond.sleep(1000);
Color c = getBackground();
g_second.setColor(c);
g_second.drawLine(0,0,second_a,second_b);用背景色清除前壹秒時的秒針
g_second.drawString("秒",second_a,second_b);
如果秒針與分針重合,恢復分針的顯示
if((second_a == minute_a)&&(second_b == minute_b)){
g_minute.drawLine(0,0,minute_a,minute_b);
g_minute.drawString("分",minute_a,minute_b);
}
如果秒針與時針重合,恢復時針的顯示
if((second_a == hour_a)&&(second_b == hour_b)){
g_hour.drawLine(0,0,hour_a,hour_b);
g_hour.drawString("時",hour_a,hour_b);
}
}
catch(InterruptedException e){
Color c = getBackground();
g_second.setColor(c);
g_second.drawLine(0,0,second_a,second_b);用背景色清除秒針
g_second.drawString("秒",second_a,second_b);
return;
}
秒針向前走壹個單位
second_a=(int)point_x[(i+1)%60];
second_b = (int)point_y[(i+1)%60]; 每壹秒走6度(壹個單位格)
g_second.setColor(Color.red);
g_second.drawLine(0,0,second_a,second_b);
g_second.drawString("秒",second_a,second_b);
i++;
}
}
if(Thread.currentThread() == tMinute){
minute_a = (int)point_x[minute];
minute_b = (int)point_y[minute];
g_minute.drawLine(0,0,minute_a,minute_b);
int i = minute;
while(true){
第壹次過60-second秒就前進壹分鐘,以後每過60秒前進壹分鐘
try{
tMinute.sleep(1000*60 - second*1000);
second = 0;
Color c = getBackground();
g_minute.setColor(c);
g_minute.drawLine(0,0,minute_a,minute_b);
g_minute.drawString("分",minute_a,minute_b);
if((hour_a == minute_a)&&(hour_b== minute_b)){
g_hour.drawLine(0,0,minute_a,minute_b);
g_hour.drawString("時",hour_a,hour_b);
}
}
catch(InterruptedException e){
return;
}
minute_a = (int)point_x[(i+1)%60];
minute_b = (int)point_y[(i+1)%60];
g_minute.setColor(Color.BLUE);
g_minute.drawLine(0,0,minute_a,minute_b);
g_minute.drawString("分",minute_a,minute_b);
i++; second = 0;
}
}
if(Thread.currentThread() == tHour){
int h = hour%12;
hour_a = (int)point_x[h*5 + minute/12];
hour_b = (int)point_y[h*5 + minute/12];
int i = h*5 + minute/12;
g_hour.drawLine(0,0,hour_a,hour_b);
g_hour.drawString("時",hour_a,hour_b);
while(true){
第壹次過12-minute%12分鐘就前進壹個刻度,以後每過12分鐘前進壹個刻度
try{
tHour.sleep(1000*60*12 - 1000*60*(minute%12) - second *1000);
minute = 0;
Color c = getBackground();
g_hour.setColor(c);
g_hour.drawLine(0,0,hour_a,hour_b);
g_hour.drawString("時",hour_a,hour_b);
}
catch(InterruptedException e){
return;
}
hour_a = (int)point_x[(i+1)%60];
hour_b = (int)point_y[(i+1)%60];
g_hour.setColor(Color.CYAN);
g_hour.drawLine(0,0,hour_a,hour_b);
g_hour.drawString("時",hour_a,hour_b);
i++;minute = 0;
}
}
}
}