import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JButton;
import javax.swing.JFrame;
class test extends JFrame
{
public test()
{
setBounds(100, 100, 500, 300);
setTitle("电子时钟");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(null);
JButton jb = new JButton("开始计时");
jb.setBounds(10, 200, 100, 30);
c.add(jb);
jb.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Clock clock = new Clock();
Thread t1 = new Thread(clock);
t1.start();
}
});
}
public void paint(Graphics g)
{
super.paint(g);//调用父类的paint()方法,这样能在画图时能保存外观
Rectangle rectangle = getBounds();//获得控件的区域
Insets insets = getInsets();//获得控件的边框
int radius = 120;//设置圆的半径是120px
int x = (rectangle.width - 2 * radius - insets.left - insets.right) / 2 + insets .left; //x坐标
int y = (rectangle.height - 2 * radius - insets.top - insets.bottom) / 2 + insets .top;//y坐标
Point2D.Double center = new Point2D.Double(x + radius, y + radius);//获得圆心坐标
g.drawOval(x, y, 2 * radius, 2 * radius);// 绘制圆形
Point2D.Double[] scales = new Point2D.Double[60];//用60个点保存表盘的刻度
double angle = Math.PI / 30;//表盘上两个点之间的夹角是PI/30
//下面代码是获得所有刻度的坐标
for (int i = 0; i < scales.length; i++)
{
scales[i] = new Point2D.Double();//初始化点对象
scales[i].setLocation(x + radius + radius * Math.sin(angle * i),
y + radius - radius * Math.cos(angle * i));//利用三角函数计算点的坐标
}
//下面代码是画所有刻度
for (int i = 0; i < scales.length; i++)
{
if (i % 5 == 0)//如果序号是5则画成大点,这些点相当于石英钟上的数字
{
g.setColor(Color.RED);
g.fillOval((int) scales[i].x - 4, (int) scales[i].y - 4, 8, 8);
}
else//如果序号不是5则画成小点,这些点相当于石英钟上的小刻度
{
g.setColor(Color.CYAN);
g.fillOval((int) scales[i].x - 2, (int) scales[i].y - 2, 4, 4);
}
}
Calendar calendar = new GregorianCalendar();//创建日期对象
int hour = calendar.get(Calendar.HOUR);//获得当前小时数
int minute = calendar.get(Calendar.MINUTE);//获得当前分钟数
int second = calendar.get(Calendar.SECOND);//获得当前秒数
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.red);//将颜色设置为红色
g2d.draw(new Line2D.Double(center, scales[second]));//绘制秒针
BasicStroke bs = new BasicStroke(3f, BasicStroke.CAP_ROUND, BasicStroke .JOIN_MI TER);
g2d.setStroke(bs);
g2d.setColor(Color.blue);//将颜色设置成蓝色
g2d.draw(new Line2D.Double(center, scales[minute]));//绘制分针
bs = new BasicStroke(6f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
g2d.setStroke(bs);
g2d.setColor(Color.green);//将颜色设置成绿色
g2d.draw(new Line2D.Double(center, scales[hour * 5 + minute / 12]));//绘制时针
}
//下面代码是编写类ClockRunnable,该类实现了Runnable接口。在run()方法中,每隔一秒钟重新绘制一次图片,由此实现走动的效果
class Clock implements Runnable
{
public void run()
{
while (true)
{
repaint();
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
public class test2
{
public static void main(String[] args)
{
test ts = new test();
ts.setVisible(true);
}
}