最近在学习java线程,照着书上例子写的钟表图形程序,对线程有一定的理解,但是发觉对图形编程的掌握不够很多函数还不能掌握~~
以下是钟表例子的代码
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;
}
}
}
}
闽公网安备 35060202000074号