class ClockCanvas extends JPanel
{
private String zone;
private GregorianCalendar calendar;
public ClockCanvas(String tz)
{
zone = tz;
calendar = new GregorianCalendar(TimeZone.getTimeZone(tz));
Timer t = new Timer(1000,new ActionListener()
{
public void actionPerformed(ActionEvent e) {
calendar.setTime(new Date());
repaint();
}
}
);
t.start();
setSize(450,350);
} @Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
g.drawOval(0, 0, 100, 100);
int seconds = calendar.get(Calendar.HOUR)*60*60
+calendar.get(Calendar.MINUTE)*60
+calendar.get(Calendar.SECOND);
double hourAngle = 2*Math.PI*(seconds-3*60*60)/(12*60*60);
double minuteAngle = 2*Math.PI*(seconds-15*60)/(60*60);
double secondAngle = 2*Math.PI*(seconds-15)/(60);
g.drawLine(50, 50, 50+(int)(30*Math.cos(hourAngle)), 50+(int)(30*Math.sin(hourAngle)));
g.drawLine(50, 50, 50+(int)(40*Math.cos(minuteAngle)), 50+(int)(40*Math.sin(minuteAngle)));
g.drawLine(50, 50, 50+(int)(45*Math.cos(secondAngle)), 50+(int)(45*Math.sin(secondAngle)));
g.drawString(zone, 0, 115);
}
}
这里用到了多线程吗?为什么t.start()后没有run方法?
repaint()怎么用的?hourAngle等这些角什么意思
{
private String zone;
private GregorianCalendar calendar;
public ClockCanvas(String tz)
{
zone = tz;
calendar = new GregorianCalendar(TimeZone.getTimeZone(tz));
Timer t = new Timer(1000,new ActionListener()
{
public void actionPerformed(ActionEvent e) {
calendar.setTime(new Date());
repaint();
}
}
);
t.start();
setSize(450,350);
} @Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
g.drawOval(0, 0, 100, 100);
int seconds = calendar.get(Calendar.HOUR)*60*60
+calendar.get(Calendar.MINUTE)*60
+calendar.get(Calendar.SECOND);
double hourAngle = 2*Math.PI*(seconds-3*60*60)/(12*60*60);
double minuteAngle = 2*Math.PI*(seconds-15*60)/(60*60);
double secondAngle = 2*Math.PI*(seconds-15)/(60);
g.drawLine(50, 50, 50+(int)(30*Math.cos(hourAngle)), 50+(int)(30*Math.sin(hourAngle)));
g.drawLine(50, 50, 50+(int)(40*Math.cos(minuteAngle)), 50+(int)(40*Math.sin(minuteAngle)));
g.drawLine(50, 50, 50+(int)(45*Math.cos(secondAngle)), 50+(int)(45*Math.sin(secondAngle)));
g.drawString(zone, 0, 115);
}
}
这里用到了多线程吗?为什么t.start()后没有run方法?
repaint()怎么用的?hourAngle等这些角什么意思
java.util.Timer是会在延时时间到达时候调用TimerTask的run方法
repaint方法就是重新绘画JPanel实例,自己想刷新画面的时候就可以直接调用
hourAngle是计算出来的一个和水平正方向的角度(弧度),然后通过这个角度计算画线的终点