📄 clocktest.java
字号:
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
import java.awt.Color.*;
import java.util.Date;
import java.awt.event.*;
import java.text.*;
public class ClockTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
ClockFrame frame=new ClockFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class ClockFrame extends JFrame
{
public ClockFrame()
{
setTitle("Display Clock");//设置标题为Display Clock
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
//add panel to frame
ClockComponent component =new ClockComponent();
add(component);
}
public static final int DEFAULT_WIDTH=400;
public static final int DEFAULT_HEIGHT=420;
}
class ClockComponent extends JComponent
{
public void ClockComponent()
{
Timer timer=new Timer(5000,new MyListener());//1000毫秒触发一次
timer.start();
}
public void paintComponent(Graphics g)
{
Graphics2D g2=(Graphics2D) g;
//先画出钟的外圆circle1
Ellipse2D circle1=new Ellipse2D.Double();
circle1.setFrameFromCenter(200,200,300,300);
g2.draw(circle1);
//返回circle1外接矩形的左上角的横纵座标(x1,y1)
double x1=circle1.getMinX();
double y1=circle1.getMinY();
Arc2D[] arc1=new Arc2D[12];
Point2D[] point1=new Point2D[12];
//定义与钟边缘为同心的圆circle2,并且circle2与circle1的半径差是整5分钟时的刻度线的长度
Ellipse2D circle2=new Ellipse2D.Double();
circle2.setFrameFromCenter(200,200,290,290);
Arc2D[] arc2=new Arc2D[12];
Point2D[] point2=new Point2D[12];
//返回circle2外接矩形的左上角的横纵座标(x1,y1)
double x2=circle2.getMinX();
double y2=circle2.getMinY();
//定义与钟边缘为同心的圆circle3,并且circle3与circle1的半径差是1分钟时的刻度线的长度
Ellipse2D circle3=new Ellipse2D.Double();
circle3.setFrameFromCenter(200,200,295,295);
Arc2D[] arc3=new Arc2D[60];
Point2D[] point3=new Point2D[60];
Arc2D[] arc4=new Arc2D[60];
Point2D[] point4=new Point2D[60];
//返回circle3外接矩形的左上角的横纵座标(x1,y1)
double x3=circle3.getMinX();
double y3=circle3.getMinY();
Line2D[] line1=new Line2D[12];//用来装每隔五分钟刻度线
Line2D[] line2=new Line2D[60];//用来装每一分钟的刻度线
//用红色画出稍长些的刻度线,每五分钟一条的,共12条
g2.setColor(Color.red);
for(int i=0;i<12;i++)
{
//在钟盘circle1上分出相等的12段弧,并返回12条弧的起点,这样确定了每5分钟时刻度线的外侧点
arc1[i]=new Arc2D.Double(x1,y1,200,200,30*i,30,Arc2D.OPEN );
point1[i]=arc1[i].getStartPoint();
//在钟盘circle2上分出相等的12段弧,并返回12条弧的起点,这样确定了每5分钟时刻度线的内侧点
arc2[i]=new Arc2D.Double(x2,y2,180,180,30*i,30,Arc2D.OPEN);
point2[i]=arc2[i].getStartPoint();
//利用已确定的五分钟刻度线的内外侧点,画出5分钟时的刻度线
line1[i]=new Line2D.Double(point1[i],point2[i]);
g2.draw(line1[i]);
}
//画出稍短的刻度线,每一分钟一条,空60条
for(int i=0;i<60;i++)
{
//在钟盘circle1上分出相等的60段弧,并返回60条弧的起点,这样确定了每1分钟时刻度线的外侧点
arc3[i]=new Arc2D.Double(x1,y1,200,200,6*i+90,6,Arc2D.OPEN );
point3[i]=arc3[i].getStartPoint();
//在钟盘circle3上分出相等的60段弧,并返回60条弧的起点,这样确定了每1分钟时刻度线的内侧点
arc4[i]=new Arc2D.Double(x3,y3,190,190,6*i+90,6,Arc2D.OPEN);
point4[i]=arc4[i].getStartPoint();
//利用已确定的一分钟刻度线的内外侧点,画出每一分钟时的刻度线
line2[i]=new Line2D.Double(point3[i],point4[i]);
g2.draw(line2[i]);
}
Date time=new Date();
SimpleDateFormat h=new SimpleDateFormat("hh");
int hh=Integer.parseInt(h.format(time));
SimpleDateFormat m=new SimpleDateFormat("mm");
int mm=Integer.parseInt(m.format(time));
SimpleDateFormat s=new SimpleDateFormat("ss");
int ss=Integer.parseInt(s.format(time));
//用来画钟表针的线
Line2D line4=new Line2D.Double(new Point2D.Double(200,200),point3[12-hh]);
Line2D line5=new Line2D.Double(new Point2D.Double(200,200),point3[60-mm]);
Line2D line6=new Line2D.Double(new Point2D.Double(200,200),point1[60-ss]);
//画红色的表针部分
g2.setPaint(Color.red);
g2.draw(line6);
//画蓝色的表针部分
g2.setPaint(Color.blue);
g2.draw(line5);
//画绿色的表针部分
g2.setPaint(Color.green);
g2.draw(line4);
//添加刻度的数字
g2.setPaint(Color.black);
g2.drawString("3",305,205);
g2.drawString("9",90,205);
g2.drawString("12",195,95);
g2.drawString("6",198,315);
g2.setPaint(Color.red);
g2.drawString("Hour:"+hh+" Minute:"+mm+"Second:"+ss,130,350);
}
class MyListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
repaint();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -