📄 clock.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import java.util.*;
public class Clock extends Frame
{
Clock()
{
Music_Clock clock = new Music_Clock();
setTitle("音乐日历时针");
add("Center",clock);
setSize(800,500);
setVisible(true);
}
public static void main(String[] args)
{
new Clock();
}
}
class Music_Clock extends JPanel implements ActionListener
{
Date date;
javax.swing.Timer secondTime;
int hour,munite,second;
Line2D secondLine,muniteLine,hourLine;
int a,b,c,width,height;
double pointSX[] = new double[60]; //表示秒钟端点X坐标的数组
double pointSY[] = new double[60]; //表示秒钟端点Y坐标的数组
double pointMX[] = new double[60];
double pointMY[] = new double[60];
double pointHX[] = new double[60];
double pointHY[] = new double[60];
public Music_Clock()
{
setBackground(Color.cyan);
initPoint();
secondTime = new javax.swing.Timer(1000,this);
secondLine = new Line2D.Double(0,0,0,0);
muniteLine = new Line2D.Double(0,0,0,0);
hourLine = new Line2D.Double(0,0,0,0);
secondTime.start();
//secondTime.addActionListener(this);
//setVisible(true);
}
private void initPoint()
{
width = getBounds().width;
height = getBounds().height;
//12点秒钟的位置
pointSX[0] = 0;
pointSY[0] = -height/2*5/6;
//12点分针的位置
pointMX[0] = 0;
pointMY[0] = -(height/2*4/5);
//12点时针的位置
pointHX[0] = 0;
pointHY[0] = -(height/2*2/3);
double angle = 6*Math.PI/180; //刻度为6度
for(int i = 0;i<59;i++) //计算数组中的坐标
{
pointSX[i+1] = pointSX[i]*Math.cos(angle)-Math.sin(angle)*pointSY[i];
pointSY[i+1] = pointSY[i]*Math.cos(angle)+pointSX[i]*Math.sin(angle);
pointMX[i+1] = pointMX[i]*Math.cos(angle)-Math.sin(angle)*pointMY[i];
pointMY[i+1] = pointMY[i]*Math.cos(angle)+pointMX[i]*Math.sin(angle);
pointHX[i+1] = pointHX[i]*Math.cos(angle)-Math.sin(angle)*pointHY[i];
pointHY[i+1] = pointHY[i]*Math.cos(angle)+pointHX[i]*Math.sin(angle);
}
for(int i = 0;i<60;i++)
{
pointSX[i] = pointSX[i]+width/2; //坐标平移
pointSY[i] = pointSY[i]+height/2;
pointMX[i] = pointMX[i]+width/2;
pointMY[i] = pointMY[i]+height/2;
pointHX[i] = pointHX[i]+width/2;
pointHY[i] = pointHY[i]+height/2;
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
initPoint();
for(int i = 0;i<60;i++) //绘制表盘上的刻度线
{
int m = (int)pointSX[i];
int n = (int)pointSY[i];
if(i%5 == 0)
{
if(i==0||i==15||i==30||i==45)
{
int k = 10;
g.setColor(Color.orange);
g.fillOval(m-k/2,n-k/2,k,k);
/*g.drawString("9",m-k/2,n-k/2);
g.drawString("3",m-k/2,n-k/2);
g.drawString("12",m-k/2,n-k/2);
g.drawString("6",m-k/2,n-k/2);*/
}
else
{
int k = 7;
g.setColor(Color.red);
g.fillOval(m-k/2,n-k/2,k,k);
}
}
else
{
int k = 2;
g.setColor(Color.black);
g.fillOval(m-k/2,n-k/2,k,k);
}
}
g.fillOval(width/2-5,height/2-5,10,10); //表中心的实心圆
Graphics2D g_2d = (Graphics2D)g;
g_2d.setColor(Color.red);
g_2d.draw(secondLine);
BasicStroke bs = new BasicStroke(2f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);
g_2d.setStroke(bs);
g_2d.setColor(Color.blue);
g_2d.draw(muniteLine);
bs = new BasicStroke(4f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g_2d.setStroke(bs);
g_2d.setColor(Color.orange);
g_2d.draw(hourLine);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == secondTime)
{
date = new Date();
String s = date.toString();
hour = Integer.parseInt(s.substring(11,13));
munite = Integer.parseInt(s.substring(14,16));
second = Integer.parseInt(s.substring(17,19)); //获取时间中的秒
int h = hour%12;
a = second; //秒钟端点坐标
b = munite;
c = h*5+munite/12;
secondLine.setLine(width/2,height/2,(int)pointSX[a],(int)pointSY[a]);
muniteLine.setLine(width/2,height/2,(int)pointMX[b],(int)pointMY[b]);
hourLine.setLine(width/2,height/2,(int)pointHX[c],(int)pointHY[c]);
repaint();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -