我本来像写一个时钟的程序,中间有一部分是就是做一个旋转的指针来指示时间,但是一直不成功,希望各位高手指点.
指针旋转我精简了一下,表述如下,如有拼写错误可能是我打错字,请高手自己更改,主要是对方法进行修改,即实现一个路径自动旋转的图形。谢!//首先是载入各个需要的包
import java.awt.geom.GeneralPath;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;//我要写的类
public class Clock_Test extends JFrame
{
    Clock_Test()  //构造方法
    {
        setSize(300,300);
        setBackground(Color.BLACK);
        setLocaiion(200,200);
        setResizable(false);
        setVisible(true);
       
        //定义一个事件,然后在加载repaint()
        ActionListener generalpath = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
repaint();
}
};

       new Timer(2000,generalpath).start(); //做一个时间片的循环
    }
    
    public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        
        //创建一个路径
        GeneralPath path = new GeneralPath();
        path.moveTo(100,100);
path.lineTo(150,150);
path.closePath();
        
        Double RAD = Math.PI/180;        g2d.translate(100,100);     //将旋转中心先平移到点(100,100) 
        
        g.setColor(getBackground());
g2d.draw(path);             //去掉之前画的路径

g2d.rotate(10*RAD);         //让他旋转一定的角度

g.setColor(Color.blue);
  g2d.draw(path);             //将颜色设定为blue后旋转
    }    public static void main(String args[])
{
Clock_Test clocktest = new Clock_Test();
clocktest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}/* 
    我在我机器上编译后都没有什么问题,但是执行后只看到一条线,而不是旋转的线,我想了很久也不知到原因,忘高手指点
*/

解决方案 »

  1.   

    参考:
    import   java.util.*;   
      import   java.awt.*;   
      import   java.applet.*;   
      import   java.text.*;   
        
      public   class   Clock   extends   Applet   implements   Runnable{   
              /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private   volatile   Thread   timer;                     //   The   thread   that   displays   clock   
              private   int   lastxs,   lastys,   lastxm,   
                                      lastym,   lastxh,   lastyh;     //   Dimensions   used   to   draw   hands     
              private   SimpleDateFormat   formatter;               //   Formats   the   date   displayed   
              private   String   lastdate;                           //   String   to   hold   date   displayed   
              private   Font   clockFaceFont;                       //   Font   for   number   display   on   clock   
              private   Date   currentDate;                         //   Used   to   get   date   to   display   
              private   Color   handColor;                           //   Color   of   main   hands   and   dial   
              private   Color   numberColor;                       //   Color   of   second   hand   and   numbers   
              private   int   xcenter   =   80,   ycenter   =   55;   //   Center   position   
        
              public   void   init()   {   
                      int   x,y;   
                      lastxs   =   lastys   =   lastxm   =   lastym   =   lastxh   =   lastyh   =   0;   
                      formatter   =   new   SimpleDateFormat   ("EEE   MMM   dd   hh:mm:ss   yyyy",     
                                                                                          Locale.getDefault());   
                      currentDate   =   new   Date();   
                      lastdate   =   formatter.format(currentDate);   
                      clockFaceFont   =   new   Font("Serif",   Font.PLAIN,   14);   
                      handColor   =   Color.blue;   
                      numberColor   =   Color.darkGray;   
        
                      try
                      {   
                              setBackground(new   Color(Integer.parseInt(getParameter("bgcolor"),   
                                                                                                                16)));   
                      }catch   (NullPointerException   e)   {   
                      }catch   (NumberFormatException   e)   {   
                      }   
                      try{   
                              handColor   =   new   Color(Integer.parseInt(getParameter("fgcolor1"),   
                                                                                                            16));   
                      }catch   (NullPointerException   e)   {   
                      }catch   (NumberFormatException   e)   {   
                      }   
                      try{   
                              numberColor   =   new   Color(Integer.parseInt(getParameter("fgcolor2"),   
                                                                                                                16));   
                      }catch   (NullPointerException   e)   {   
                      }catch   (NumberFormatException   e)   {   
                      }   
                      resize(300,300);                             //   Set   clock   window   size   
              }   
      

  2.   

    续:
      //   Paint   is   the   main   part   of   the   program   
              public   void   update(Graphics   g)   {   
                      int   xh,   yh,   xm,   ym,   xs,   ys;   
                      int   s   =   0,   m   =   10,   h   =   10;   
                      String   today;   
        
                      currentDate   =   new   Date();   
                        
                      formatter.applyPattern("s");   
                      try   {   
                              s   =   Integer.parseInt(formatter.format(currentDate));   
                      }   catch   (NumberFormatException   n)   {   
                              s   =   0;   
                      }   
                      formatter.applyPattern("m");   
                      try   {   
                              m   =   Integer.parseInt(formatter.format(currentDate));   
                      }   catch   (NumberFormatException   n)   {   
                              m   =   10;   
                      }           
                      formatter.applyPattern("h");   
                      try   {   
                              h   =   Integer.parseInt(formatter.format(currentDate));   
                      }   catch   (NumberFormatException   n)   {   
                              h   =   10;   
                      }   
                
                      //   Set   position   of   the   ends   of   the   hands   
                      xs   =   (int)   (Math.cos(s   *   Math.PI   /   30   -   Math.PI   /   2)   *   45   +   xcenter);   
                      ys   =   (int)   (Math.sin(s   *   Math.PI   /   30   -   Math.PI   /   2)   *   45   +   ycenter);   
                      xm   =   (int)   (Math.cos(m   *   Math.PI   /   30   -   Math.PI   /   2)   *   40   +   xcenter);   
                      ym   =   (int)   (Math.sin(m   *   Math.PI   /   30   -   Math.PI   /   2)   *   40   +   ycenter);   
                      xh   =   (int)   (Math.cos((h*30   +   m   /   2)   *   Math.PI   /   180   -   Math.PI   /   2)   *   30   
                                            +   xcenter);   
                      yh   =   (int)   (Math.sin((h*30   +   m   /   2)   *   Math.PI   /   180   -   Math.PI   /   2)   *   30   
                                            +   ycenter);   
                
                      //   Get   the   date   to   print   at   the   bottom   
                      formatter.applyPattern("EEE   MMM   dd   HH:mm:ss   yyyy");   
                      today   =   formatter.format(currentDate);   
        
                      g.setFont(clockFaceFont);   
                      //   Erase   if   necessary   
                      g.setColor(getBackground());   
                      if   (xs   !=   lastxs   ||   ys   !=   lastys)   {   
                              g.drawLine(xcenter,   ycenter,   lastxs,   lastys);   
                              g.drawString(lastdate,   5,   125);   
                      }   
                      if   (xm   !=   lastxm   ||   ym   !=   lastym)   {   
                              g.drawLine(xcenter,   ycenter-1,   lastxm,   lastym);   
                              g.drawLine(xcenter-1,   ycenter,   lastxm,   lastym);     
                      }   
                      if   (xh   !=   lastxh   ||   yh   !=   lastyh)   {   
                              g.drawLine(xcenter,   ycenter-1,   lastxh,   lastyh);   
                              g.drawLine(xcenter-1,   ycenter,   lastxh,   lastyh);     
                      }   
        
                      //   Draw   date   and   hands   
                      g.setColor(numberColor);   
                      g.drawString(today,   5,   125);           
                      g.drawLine(xcenter,   ycenter,   xs,   ys);   
                      g.setColor(handColor);   
                      g.drawLine(xcenter,   ycenter-1,   xm,   ym);   
                      g.drawLine(xcenter-1,   ycenter,   xm,   ym);   
                      g.drawLine(xcenter,   ycenter-1,   xh,   yh);   
                      g.drawLine(xcenter-1,   ycenter,   xh,   yh);   
                      lastxs   =   xs;   lastys   =   ys;   
                      lastxm   =   xm;   lastym   =   ym;   
                      lastxh   =   xh;   lastyh   =   yh;   
                      lastdate   =   today;   
                      currentDate   =   null;   
              }   
        
              public   void   paint(Graphics   g)   {   
                      g.setFont(clockFaceFont);   
                      //   Draw   the   circle   and   numbers   
                      g.setColor(handColor);   
                      g.drawArc(xcenter-50,   ycenter-50,   100,   100,   0,   360);   
                      g.setColor(numberColor);   
                      g.drawString("9",   xcenter-45,   ycenter+3);     
                      g.drawString("3",   xcenter+40,   ycenter+3);   
                      g.drawString("12",   xcenter-5,   ycenter-37);   
                      g.drawString("6",   xcenter-3,   ycenter+45);   
        
                      //   Draw   date   and   hands   
                      g.setColor(numberColor);   
                      g.drawString(lastdate,   5,   125);           
                      g.drawLine(xcenter,   ycenter,   lastxs,   lastys);   
                      g.setColor(handColor);   
                      g.drawLine(xcenter,   ycenter-1,   lastxm,   lastym);   
                      g.drawLine(xcenter-1,   ycenter,   lastxm,   lastym);   
                      g.drawLine(xcenter,   ycenter-1,   lastxh,   lastyh);   
                      g.drawLine(xcenter-1,   ycenter,   lastxh,   lastyh);     
              }   
        
              public   void   start()   {   
                      timer   =   new   Thread(this);   
                      timer.start();   
              }   
        
              public   void   stop()   {   
                      timer   =   null;   
              }   
        
              public   void   run()   {   
                      Thread   me   =   Thread.currentThread();   
                      while   (timer   ==   me)   {   
                              try   {   
                                      Thread.currentThread().sleep(100);   
                              }   catch   (InterruptedException   e)   {   
                              }   
                              repaint();   
                      }   
              }   
        
              public   String   getAppletInfo()   {   
                      return   "Title:   A   Clock   \n"   
                              +   "Author:   Rachel   Gollub,   1995   \n"   
                              +   "An   analog   clock.";   
              }   
            
              public   String[][]   getParameterInfo()   {   
                      String[][]   info   =   {   
                              {"bgcolor",   "hexadecimal   RGB   number",     
                                "The   background   color.   Default   is   the   color   of   your   browser."},   
                              {"fgcolor1",   "hexadecimal   RGB   number",     
                                "The   color   of   the   hands   and   dial.   Default   is   blue."},   
                              {"fgcolor2",   "hexadecimal   RGB   number",     
                                "The   color   of   the   second   hand   and   numbers.   Default   is   dark   gray."}   
                      };   
                      return   info;   
              }   
      }
      

  3.   

    不过我的监视器没有问题,在paint()方法中插入一个System.out.println("1");后发现时间片循环正常,但是paint()没有预期结果!