📄 myclock.java
字号:
//MyClock.java
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.net.*;
class Hms extends Date
{
public Hms(double localOffset){ //如果HTML文件中设置了时区,则把时间设为当地时区时间
super();
long tzOffset=getTimezoneOffset()*60L*1000L;
localOffset *= 3600000.0;
setTime(getTime() + tzOffset + (long)localOffset);
}
public Hms(){ //如果没有设置时区,则就使用当地的时间
super();
}
public double get_hours() //时间换算,把如5:30这样的时间换算成5.5
{
return (double)super.getHours()+(double)getMinutes()/60.0;
}
}
abstract class ClockHand //抽象类,提供时针、分针、秒针类使用
{
protected int baseX[], baseY[];
protected int transX[],transY[];
protected int numberOfPoints;
public ClockHand(int originX, int originY, int length,int thickness,int points){
baseX= new int[points]; baseY=new int[points];
transX= new int[points]; transY=new int[points];
initiallizePoints(originX,originY,length,thickness);
numberOfPoints=points;
}
abstract protected void initiallizePoints( int originX,
int originY,
int length,
int thickness);
abstract public void draw(Color color, double angle, Graphics g);
protected void transform(double angle) //通过角度计算出时针、分针、秒针的绘制位置
{
for(int i=0;i<numberOfPoints;i++){
transX[i]=(int)( (baseX[0]-baseX[i]) * Math.cos(angle) -
(baseY[0]-baseY[i]) * Math.sin(angle) +
baseX[0]);
transY[i]=(int)( (baseX[0]-baseX[i]) * Math.sin(angle) +
(baseY[0]-baseY[i]) * Math.cos(angle) +
baseY[0]);
}
}
}
//秒针使用的类
class SweepHand extends ClockHand
{
public SweepHand(int originX,int originY, int length, int points)
{
super(originX,originY,length,0,points);
}
protected void initiallizePoints(int originX,int originY, int length, int unused) //初始化点
{
baseX[0]=originX; baseY[0]=originY;
baseX[1]=originX; baseY[1]=originY-length/5;
baseX[2]=originX; baseY[2]=originY+length;
}
public void draw(Color color, double angle, Graphics g) //绘制秒针,为线段
{
transform(angle);
g.setColor(color);
g.drawLine(transX[1],transY[1],transX[2],transY[2]);
}
}
class HmHand extends ClockHand
{
public HmHand(int originX,int originY, int length,int thickness, int points){
super(originX,originY,length,thickness,points);
}
protected void initiallizePoints( int originX, //初始化点
int originY,
int length,
int thickness)
{
baseX[0]=originX;
baseY[0]=originY;
baseX[1]=baseX[0]-thickness/2;
baseY[1]=baseY[0]+thickness/2;
baseX[2]=baseX[1];
baseY[2]=baseY[0]+length- thickness;
baseX[3]=baseX[0];
baseY[3]=baseY[0]+length;
baseX[4]=baseX[0]+thickness/2;
baseY[4]=baseY[2];
baseX[5]=baseX[4];
baseY[5]=baseY[1];
}
public void draw(Color color,double angle, Graphics g) //绘制时针分针,为多边形
{
transform(angle);
g.setColor(color);
g.fillPolygon(transX,transY,numberOfPoints);
}
}
//Hms类是进行时间换算的类
//ClockHand是绘制指针的抽象基类,同时提供将角度转换为坐标的方法
//SweepHand是秒针绘制使用的类
//HmHand是时针分针绘制使用的类
//接着上面的部分,下面是APPLET主程序部分:
public class MyClock extends Applet implements Runnable
{
static final int BACKGROUND=0; //背景图片的序号,供数组使用
static final int LOGO=1; //LOGO图片的序号,供数组使用
static final String JAVEX="bear"; //表盘上显示的文字
static final double MINSEC=0.104719755; //分针和秒针在表盘上的刻度(60个)间的弧度
static final double HOUR=0.523598776; //时针在表盘上的刻度(24个)间的弧度
Thread clockThread = null; //使用多线程机制,用另一个线程不断显示图片
//提供的默认参数,如果HTML文件里面没有给参数就使用
int width = 100;
int height = 100;
Color bgColor = new Color(0,0,0);
Color faceColor = new Color(0,0,0);
Color sweepColor = new Color(255,0,0);
Color minuteColor = new Color (192,192,192);
Color hourColor = new Color (255,255,255);
Color textColor = new Color (255,255,255);
Color caseColor = new Color (0,0,0);
Color trimColor = new Color (192,192,192);
String logoString=null;
Image images[] = new Image[2]; //背景和LOGO的图片
boolean isPainted=false; //如果第一次载入时绘制背景及表盘,其他时候重绘则只绘制指针
//时钟圆心的位置
int x1,y1;
//最上面那个三角形的刻度图形的坐标
int xPoints[]=new int[3], yPoints[]=new int[3];
//保存当前时间,转换成(double)(hours + minutes/60)
Hms cur_time;
//秒针、分针、时针
SweepHand sweep;
HmHand minuteHand,
hourHand;
//用于绘制的时、分、秒
double lastHour;
int lastMinute,lastSecond;
//显示日期和表盘上的字母的字体
Font font;
//图片显示使用了缓冲机制,offScrImage和offScrGC存放缓冲区内图片的信息
Image offScrImage;
Graphics offScrGC;
//用于测试背景图片和LOGO图片
MediaTracker tracker;
int minDimension; // 如果背景区域不是正方形的话,保证时钟在中间显示
int originX; // 时钟图形所在正方形区域的左上角X坐标
int originY; // 时钟图形所在正方形区域的左上角Y坐标
double tzDifference=0; //时区间的差,向西为负数,向东为正数
boolean localOnly=false; //是否只使用本地时间,如果为FALSE则可以根据传入的时区显示该时区时间
//保存参数的类型说明
public String[][] getParameterInfo()
{
String[][] info = {
{"width", "int", "APPLET的长度,以象素为单位"},
{"height", "int", "APPLET的宽度,以象素为单位"},
{"bgColor", "string", "背景颜色,e.g FF0000"},
{"faceColor", "string", "表盘颜色"},
{"sweepColor", "string", "秒针颜色"},
{"minuteColor", "string", "分针颜色"},
{"hourColor", "string", "时针颜色"},
{"textColor", "string", "文本颜色"},
{"caseColor", "string", "框内颜色"},
{"trimColor", "string", "空白区颜色"},
{"bgImageURL", "string", "背景图片地址"},
{"logoString", "string", "LOGO字符"},
{"logoImageURL","string", "LOGO图片地址"},
{"timezone", "real", "时区间的差"},
{"localonly", "int", "是否考虑到时区差别"}
};
return info;
}
//显示信息
public String getAppletInfo()
{
return "版权所有,COPY必究,保护正版,人人有责";
}
void showURLerror(Exception e)
{
String errorMsg = "URL错误:"+e;
showStatus(errorMsg);
System.err.println(errorMsg);
}
//相当于把时钟变成100×100的大小,percent即相对坐标
private int size(int percent)
{
return (int)((double)percent/100.0 * (double)minDimension);
}
public void init()
{
URL imagesURL[] = new URL[2];
String szImagesURL[] = new String[2];
tracker = new MediaTracker(this);
//得到HTML页面提供的参数,并把它转换相应的格式
String paramString = getParameter( "WIDTH" );
if( paramString != null )
width = Integer.valueOf(paramString).intValue();
paramString = getParameter( "HEIGHT" );
if( paramString != null )
height = Integer.valueOf(paramString).intValue();
paramString = getParameter( "TIMEZONE" );
if( paramString != null )
tzDifference = Double.valueOf(paramString).doubleValue();
paramString = getParameter( "LOCALONLY" );
if( paramString != null && Integer.valueOf(paramString).intValue() != 0){
localOnly=true;
tzDifference=0.;
}
paramString = getParameter( "BGCOLOR");
if( paramString != null )
bgColor=parseColorString(paramString);
paramString = getParameter( "FACECOLOR");
if( paramString != null )
faceColor=parseColorString(paramString);
paramString = getParameter( "SWEEPCOLOR");
if( paramString != null )
sweepColor=parseColorString(paramString);
paramString = getParameter( "MINUTECOLOR");
if( paramString != null )
minuteColor=parseColorString(paramString);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -