📄 goodclock.java
字号:
//写一个时钟小程序
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class GoodClock extends Applet implements Runnable{//使用多线程
private int hour;
private int minute;
private int second;
private Color col;
// private int x;
// private int y;
int[][] sec = new int[60][2];//秒针终点的坐标
int[][] min = new int[60][2];//分针终点坐标
int[][] hou = new int[60][2];//时针终点坐标
//相当于一个构造方法
public void init(){
point();//初始化p数组 把每个时间指针应指向的终点坐标存入数组
}
public void start(){
Thread s = new Thread(this){
public void run(){//匿名内部类 重写run方法
int i = 0;
while(true){
Color[] c ={Color.RED,Color.GREEN,Color.BLUE};//每秒变一次颜色 红绿蓝
col = c[i];
i = (i+1)%3;
GregorianCalendar gre = new GregorianCalendar();
second = gre.get(gre.SECOND);
repaint();
try{
Thread.sleep(1000);//休眠1秒
}catch(Exception e){}
}
}
};//秒针的线程
Thread m = new Thread(this){
public void run(){
//对分针初始化
GregorianCalendar greg = new GregorianCalendar();
minute = greg.get(greg.MINUTE);
repaint();
while(true){//秒针一圈 移动分针
if(second == 0){
GregorianCalendar gre = new GregorianCalendar();
minute = gre.get(gre.MINUTE);
repaint();
try{
Thread.sleep(1000*60);//休眠一分钟
}catch(Exception e){}
}
}
}
};
Thread h = new Thread(this){
public void run(){
//对时针初始化
GregorianCalendar greg = new GregorianCalendar();
hour = (greg.get(greg.HOUR)%12)*5+minute/12;
repaint();
while(true){//分针转12分钟 移动时针
if(minute%12 == 0){
GregorianCalendar gre = new GregorianCalendar();
hour = (gre.get(gre.HOUR)%12)*5+minute/12;// 注意小时的转换
repaint();
try{
Thread.sleep(1000*60*12);//休眠12分钟
}catch(Exception e){}
}
}
}
};
s.start();
m.start();
h.start();
}
//计算三角函数 指针终点坐标 并存入数组
public void point(){
int secondLength = 80;//秒针的长度
int minuteLength = 65;//分针的长度
int hourLength = 50;//时针的长度
double[][] p = new double[60][2];//存储各个角度的三角函数值
for(int i=0;i<60;i++){//这里从0开始
p[i][0] = Math.sin((Math.PI/30)*((60-(i-30))%60));
p[i][1] = Math.cos((Math.PI/30)*((60-(i-30))%60));
}
for(int i=0;i<60;i++){
sec[i][0] = (int)(110+secondLength*p[i][0]);
sec[i][1] = (int)(110+secondLength*p[i][1]);
min[i][0] = (int)(110+minuteLength*p[i][0]);
min[i][1] = (int)(110+minuteLength*p[i][1]);
hou[i][0] = (int)(110+hourLength*p[i][0]);
hou[i][1] = (int)(110+hourLength*p[i][1]);
}
}
//画上时间刻度 和 边框
/*public void drawNumber(Graphics g){
g.setColor(col);
g.drawOval(20,20,180,180);//画出表的边框(圆的中心坐标是110 110半径是90)
g.drawString("12",106,40);
g.drawString("3",185,110);
g.drawString("6",108,190);
g.drawString("9",30,110);
}*/
public void paint(Graphics g){ //究竟是谁调用的paint??????
//drawNumber(g);为什么这样调用浏览器里不会显示边框和刻度? 但是appletveiwer确可以?
g.setColor(col);
g.drawOval(20,20,180,180);//画出表的边框(圆的中心坐标是110 110半径是90)
g.drawString("12",106,40);
g.drawString("3",185,110);
g.drawString("6",108,190);
g.drawString("9",30,110);
g.setColor(Color.darkGray);
g.drawLine(110,110,sec[second][0],sec[second][1]);//画秒针
g.drawLine(110,110,min[minute][0],min[minute][1]);//画分针
g.drawLine(110,110,hou[hour][0],hou[hour][1]);//画时针
}
public void run(){//空的方法 不写不行。。。。
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -