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等这些角什么意思

解决方案 »

  1.   

    javax.swing.Timer是会在延时时间到达时候调用ActionListener的actionPerformed方法
    java.util.Timer是会在延时时间到达时候调用TimerTask的run方法
    repaint方法就是重新绘画JPanel实例,自己想刷新画面的时候就可以直接调用
    hourAngle是计算出来的一个和水平正方向的角度(弧度),然后通过这个角度计算画线的终点
      

  2.   

    多看看start方法的源代码,你就会知道原理了
      

  3.   

    没有用到多线程,只是用到了定时器,Thread才是多线程,lz要学好多线程,很重要的