import   java.awt.*; 
import   java.util.*; 
import   javax.swing.*; 
import   java.awt.geom.*; //主类   
public   class   ClockTest   
{       
        public   static   void   main(String[]   args)   
        { 
        Clockframe   frame=new   Clockframe(); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true); 
        } 
} class   Clockframe   extends   JFrame   

public   Clockframe() 

setTitle("时钟"); 
setSize(400,400); panel=new   Clockpanel(); 
panel.start(); 
add(panel,BorderLayout.CENTER); 

private   Clockpanel   panel; 
} //时钟界面类 
class   Clockpanel   extends   JPanel   implements   Runnable 

        public   void   paintComponent(Graphics   g) 

      super.paintComponents(g); 
g2=(Graphics2D)g; 
        Ellipse2D   circle=new   Ellipse2D.Double(100,100,r,r); 
        g2.draw(circle); //获取时间 
nowtime=Calendar.getInstance(); 
hour=nowtime.get(Calendar.HOUR_OF_DAY); 
minute=nowtime.get(Calendar.MINUTE); 
secend=nowtime.get(Calendar.SECOND); //设置钟面 
Font   font=new   Font("SansSerif",Font.BOLD,12); 
g2.setFont(font);   
drawstring("1",Math.toRadians(90-360*1/12),0.44*r);   
drawstring("2",Math.toRadians(90-360*2/12),0.44*r); 
drawstring("3",Math.toRadians(90-360*3/12),0.46*r); 
drawstring("4",Math.toRadians(90-360*4/12),0.46*r); 
drawstring("5",Math.toRadians(90-360*5/12),0.48*r); 
drawstring("6",Math.toRadians(90-360*6/12),0.5*r); 
drawstring("7",Math.toRadians(90-360*7/12),0.5*r); 
drawstring("8",Math.toRadians(90-360*8/12),0.5*r); 
drawstring("9",Math.toRadians(90-360*9/12),0.5*r); 
drawstring("10",Math.toRadians(90-360*10/12),0.48*r); 
drawstring("11",Math.toRadians(90-360*11/12),0.46*r); 
drawstring("12",Math.toRadians(90-360*12/12),0.44*r); //画时针 
                double   hourAngle=Math.toRadians(90-360*hour/12); 
                drawHand(g2,hourAngle,0.2*r); 
                
                //画分针 
                g2.setColor(Color.blue); 
                double   minuteAngle=Math.toRadians(90-360*minute/60); 
                drawHand(g2,minuteAngle,0.3*r); 
                
                //画秒针 
                g2.setColor(Color.red); 
                double   secendAngle=Math.toRadians(90-360*secend/60); 
                drawHand(g2,secendAngle,0.4*r); 
                //画出时间 
                g2.drawString(hour+":"+minute+":"+secend,180,350); }   
        //画线方法 
public   void   drawHand(Graphics2D   g2,double   angle,double   length) 

Point2D   end=new   Point2D.Double( 
r+length*Math.cos(angle), 
r-length*Math.sin(angle)); 
Point2D   fist=new   Point2D.Double(r,r); 
g2.draw(new   Line2D.Double(fist,end)); 
} //画表盘的方法 
public   void   drawstring(String   s,double   angle,double   length) 

int   y=(int)(r-length*Math.sin(angle)); 
int   x=(int)(r+length*Math.cos(angle)); 
g2.drawString(s,x,y); 
} public   void   start()//用于启动的标准程序   
{   
if   (clockThread   ==   null)   //判断线程是否还未创建   
clockThread   =   new   Thread(this); 
clockThread.start();//启动线程   
}   public   void   run()   //用于定义运行内容的标准程序   

    
while   (true)   
{   
try   {   
clockThread.sleep(1000);//休眠1秒   
}   catch   (InterruptedException   e){}   //异常错误处理,防止出现中断错误 
      repaint();//重绘组件   
}   
}         private   Thread   clockThread; 
        private   Graphics2D   g2; 
private   int   r=200; 
private   Calendar   nowtime; 
private   int   hour; 
private   int   minute; 
private   int   secend; 
}

解决方案 »

  1.   

      //时钟界面类   
    class  Clockpanel extends JPanel implements Runnable   
    {   
    public void paintComponent(Graphics g)   
    {   
    super.paintComponent(g);    //这个方法拼写错了,父类的方法负责擦除
                     // super.paintComponents(g);   就是那个方法拼写错了,代码帮你重帖一下
      import java.awt.*;   
    import java.util.*;   
    import javax.swing.*;   
    import java.awt.geom.*;   //主类       
    public  class   ClockTest       
    {               
        public static  void main(String[] args)       
        {   
            Clockframe       frame=new       Clockframe();   
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
            frame.setVisible(true);   
        }   
    }   class Clockframe extends JFrame       
    {   
    public Clockframe()   
    {   
    setTitle("时钟");   
    setSize(400,400);   

    panel=new       Clockpanel();   
    panel.start();   
    add(panel,BorderLayout.CENTER);   
    }   
    private  Clockpanel panel;   
    }   //时钟界面类   
    class  Clockpanel extends JPanel implements Runnable   
    {   
    public void paintComponent(Graphics g)   
    {   
    super.paintComponent(g);    //这个方法拼写错了,父类的方法负责擦除
                     // super.paintComponents(g);    g2=(Graphics2D)g;   
    Ellipse2D       circle=new       Ellipse2D.Double(100,100,r,r);   
    g2.draw(circle);   

    //获取时间   
    nowtime=Calendar.getInstance();   
    hour=nowtime.get(Calendar.HOUR_OF_DAY);   
    minute=nowtime.get(Calendar.MINUTE);   
    secend=nowtime.get(Calendar.SECOND);   

    //设置钟面   
    Font       font=new       Font("SansSerif",Font.BOLD,12);   
    g2.setFont(font);       
    drawstring("1",Math.toRadians(90-360*1/12),0.44*r);       
    drawstring("2",Math.toRadians(90-360*2/12),0.44*r);   
    drawstring("3",Math.toRadians(90-360*3/12),0.46*r);   
    drawstring("4",Math.toRadians(90-360*4/12),0.46*r);   
    drawstring("5",Math.toRadians(90-360*5/12),0.48*r);   
    drawstring("6",Math.toRadians(90-360*6/12),0.5*r);   
    drawstring("7",Math.toRadians(90-360*7/12),0.5*r);   
    drawstring("8",Math.toRadians(90-360*8/12),0.5*r);   
    drawstring("9",Math.toRadians(90-360*9/12),0.5*r);   
    drawstring("10",Math.toRadians(90-360*10/12),0.48*r);   
    drawstring("11",Math.toRadians(90-360*11/12),0.46*r);   
    drawstring("12",Math.toRadians(90-360*12/12),0.44*r);    //画时针   
            double       hourAngle=Math.toRadians(90-360*hour/12);   
            drawHand(g2,hourAngle,0.2*r);   
            
            //画分针   
            g2.setColor(Color.blue);   
            double       minuteAngle=Math.toRadians(90-360*minute/60);   
            drawHand(g2,minuteAngle,0.3*r);   
            
            //画秒针   
            g2.setColor(Color.red);   
            double       secendAngle=Math.toRadians(90-360*secend/60);   
            drawHand(g2,secendAngle,0.4*r);   
            //画出时间   
            g2.drawString(hour+":"+minute+":"+secend,180,350);    }       

    //画线方法   
    public  void drawHand(Graphics2D g2,double angle,double length)   
    {   
    Point2D end=new Point2D.Double(   
    r+length*Math.cos(angle),   
    r-length*Math.sin(angle));   
    Point2D fist=new Point2D.Double(r,r);   
    g2.draw(new Line2D.Double(fist,end));   
    }    //画表盘的方法   
    public  void  drawstring(String  s,double angle,double length)   
    {   
    int y=(int)(r-length*Math.sin(angle));   
    int x=(int)(r+length*Math.cos(angle));   
    g2.drawString(s,x,y);   
    }    public  void start()//用于启动的标准程序       
    {       
    if (clockThread == null)       //判断线程是否还未创建       
    clockThread =  new Thread(this);   
    clockThread.start();//启动线程       
    }        public void run()       //用于定义运行内容的标准程序       
    {   
            
    while (true)       
    {       
    try{       
    clockThread.sleep(1000);//休眠1秒       
    } catch(InterruptedException       e){}       //异常错误处理,防止出现中断错误   
               
            repaint();//重绘组件       
    }       
    }       private       Thread       clockThread;   
        private       Graphics2D       g2;   
    private       int       r=200;   
    private       Calendar       nowtime;   
    private       int       hour;   
    private       int       minute;   
    private       int       secend;   

     
      

  2.   

    为什么代码没有缩进呀,重帖一下public void run()       //用于定义运行内容的标准程序       
    {   
            
    while (true)       
    {       
    try{       
    clockThread.sleep(1000);//休眠1秒       
    } catch(InterruptedException       e){}       //异常错误处理,防止出现中断错误   
               
            repaint();//重绘组件       
    }       
    }   
      

  3.   


    import java.awt.*;   
    import java.util.*;   
    import javax.swing.*;   
    import java.awt.geom.*;   //主类       
    public  class   ClockTest       
    {               
        public static  void main(String[] args)       
        {   
            Clockframe       frame=new       Clockframe();   
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
            frame.setVisible(true);   
        }   
    }   class Clockframe extends JFrame       
    {   
    public Clockframe()   
    {   
    setTitle("时钟");   
    setSize(400,400);   

    panel=new       Clockpanel();   
    panel.start();   
    add(panel,BorderLayout.CENTER);   
    }   
    private  Clockpanel panel;   
    }   //时钟界面类   
    class  Clockpanel extends JPanel implements Runnable   
    {   
    public void paintComponent(Graphics g)   
    {   
    super.paintComponent(g);     g2=(Graphics2D)g;   
    Ellipse2D       circle=new       Ellipse2D.Double(100,100,r,r);   
    g2.draw(circle);   

    //获取时间   
    nowtime=Calendar.getInstance();   
    hour=nowtime.get(Calendar.HOUR_OF_DAY);   
    minute=nowtime.get(Calendar.MINUTE);   
    secend=nowtime.get(Calendar.SECOND);   

    //设置钟面   
    Font       font=new       Font("SansSerif",Font.BOLD,12);   
    g2.setFont(font);       
    drawstring("1",Math.toRadians(90-360*1/12),0.44*r);       
    drawstring("2",Math.toRadians(90-360*2/12),0.44*r);   
    drawstring("3",Math.toRadians(90-360*3/12),0.46*r);   
    drawstring("4",Math.toRadians(90-360*4/12),0.46*r);   
    drawstring("5",Math.toRadians(90-360*5/12),0.48*r);   
    drawstring("6",Math.toRadians(90-360*6/12),0.5*r);   
    drawstring("7",Math.toRadians(90-360*7/12),0.5*r);   
    drawstring("8",Math.toRadians(90-360*8/12),0.5*r);   
    drawstring("9",Math.toRadians(90-360*9/12),0.5*r);   
    drawstring("10",Math.toRadians(90-360*10/12),0.48*r);   
    drawstring("11",Math.toRadians(90-360*11/12),0.46*r);   
    drawstring("12",Math.toRadians(90-360*12/12),0.44*r);    //画时针   
            double       hourAngle=Math.toRadians(90-360*hour/12);   
            drawHand(g2,hourAngle,0.2*r);   
            
            //画分针   
            g2.setColor(Color.blue);   
            double       minuteAngle=Math.toRadians(90-360*minute/60);   
            drawHand(g2,minuteAngle,0.3*r);   
            
            //画秒针   
            g2.setColor(Color.red);   
            double       secendAngle=Math.toRadians(90-360*secend/60);   
            drawHand(g2,secendAngle,0.4*r);   
            //画出时间   
            g2.drawString(hour+":"+minute+":"+secend,180,350);    }       

    //画线方法   
    public  void drawHand(Graphics2D g2,double angle,double length)   
    {   
    Point2D end=new Point2D.Double(   
    r+length*Math.cos(angle),   
    r-length*Math.sin(angle));   
    Point2D fist=new Point2D.Double(r,r);   
    g2.draw(new Line2D.Double(fist,end));   
    }    //画表盘的方法   
    public  void  drawstring(String  s,double angle,double length)   
    {   
    int y=(int)(r-length*Math.sin(angle));   
    int x=(int)(r+length*Math.cos(angle));   
    g2.drawString(s,x,y);   
    }    public  void start()//用于启动的标准程序       
    {       
    if (clockThread == null)       //判断线程是否还未创建       
    clockThread =  new Thread(this);   
    clockThread.start();//启动线程       
    }        public void run()       //用于定义运行内容的标准程序       
    {   
            
    while (true)       
    {       
    try{       
    clockThread.sleep(1000);//休眠1秒       
    } catch(InterruptedException       e){}       //异常错误处理,防止出现中断错误   
               
            repaint();//重绘组件       
    }       
    }       private       Thread       clockThread;   
        private       Graphics2D       g2;   
    private       int       r=200;   
    private       Calendar       nowtime;   
    private       int       hour;   
    private       int       minute;   
    private       int       secend;   

    这回终于可以了
      

  4.   

    因为hour=nowtime.get(Calendar.HOUR_OF_DAY);获得的是24小时表示的时间,所以计算角度的时候要%12;换算成12小时制的double hourAngle=Math.toRadians(90-360*(hour%12)/12); 不过改成这样还是不完善,因为你的Watch只有在过了一分钟,或者一小时的时候分针和时针才会跳一格,所以每次应该把时针和分针的移动都加上去。
    把画时针和分针的代码改成:
    double hourAngle=Math.toRadians(90-360*(hour%12)/12-(double)minute/60 * 30); 
    double minuteAngle=Math.toRadians(90-360*minute/60-(double)second/60 * 6);