java题目求解!求附上代码,并有代码的重要解析
题目:利用Java的GUI和多线程编程技术,编写一个时钟显示程序。

解决方案 »

  1.   

    一个 π 是180°   HRadian=(PI/6)*Hour+(PI/360)*Minute+(PI/21600)*Second;  PI是π的近似值 PI/6 就是每一个小时占的弧度PI/360 是每一个分钟占的弧度PI/360其实是PI/(6*60)  PI/21600是PI/(6*60*60)每一分钟在π里占的弧度  以此类推。
    import java.util.*;
    import java.awt.*;
    import java.applet.*;
    import java.text.*;
    public class Exam5Test8 extends Applet implements Runnable {
     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
     }
     // 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();
      }
     }
     /*返回有关此 applet 的信息。applet 应该重写此方法,返回包含有关 applet 的作者、版本和版权信息的 String。
     Applet 类提供的此方法实现返回 null
      */
     public String getAppletInfo() {
      return "Title: A Clock \n" + "Author: 陈金林, 2011 \n"
        + "An analog clock.";
     }
     /*返回此 applet 理解的关于参数的信息。applet 应该重写此方法,返回描述这些参数的 String 数组。
     数组的每个元素应该是三个 String 的集合,包括名称、类型和描述。
      */
     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;
     }
    }
      

  2.   

    package event;
    import java.awt.event.*;
    import java.awt.*;
    import java.util.Calendar;
    import java.util.GregorianCalendar;import javax.swing.*;
    public class ClockAnimation  extends JFrame{
    private StillClock clock=new StillClock();public ClockAnimation()
    {
    add(clock);
    Timer timer=new Timer(1000,new TimerListener());
    timer.start();}
    private class TimerListener implements ActionListener
    {
    public void actionPerformed(ActionEvent e )
    {
    clock.setCurrentTime();
    clock.repaint();}
    }
    public static void main(String [] args)
    {
    ClockAnimation frame=new ClockAnimation();
    frame.setSize(400,200);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("ClockAnimation");}
    }
    class StillClock extends JPanel {
      private int hour;
      private int minute;
      private int second;   /** Construct a default clock with the current time*/
      public StillClock() {
        setCurrentTime();
      }   /** Construct a clock with specified hour, minute, and second */
      public StillClock(int hour, int minute, int second) {
        this.hour = hour;
        this.minute = minute;
        this.second = second;
      }   /** Return hour */
      public int getHour() {
        return hour;
      }   /** Set a new hour */
      public void setHour(int hour) {
        this.hour = hour;
        repaint();
      }   /** Return minute */
      public int getMinute() {
        return minute;
      }   /** Set a new minute */
      public void setMinute(int minute) {
        this.minute = minute;
        repaint();
      }   /** Return second */
      public int getSecond() {
        return second;
      }   /** Set a new second */
      public void setSecond(int second) {
        this.second = second;
        repaint();
      }   /** Draw the clock */
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);     // Initialize clock parameters
        int clockRadius =
          (int)(Math.min(getWidth(), getHeight()) * 0.8 * 0.5);
        int xCenter = getWidth() / 2;
        int yCenter = getHeight() / 2;     // Draw circle
        g.setColor(Color.black);
        g.drawOval(xCenter - clockRadius, yCenter - clockRadius,
          2 * clockRadius, 2 * clockRadius);
        g.drawString("12", xCenter - 5, yCenter - clockRadius + 12);
        g.drawString("9", xCenter - clockRadius + 3, yCenter + 5);
        g.drawString("3", xCenter + clockRadius - 10, yCenter + 3);
        g.drawString("6", xCenter - 3, yCenter + clockRadius - 3);     // Draw second hand
        int sLength = (int)(clockRadius * 0.8);
        int xSecond = (int)(xCenter + sLength *
          Math.sin(second * (2 * Math.PI / 60)));
        int ySecond = (int)(yCenter - sLength *
          Math.cos(second * (2 * Math.PI / 60)));
        g.setColor(Color.red);
        g.drawLine(xCenter, yCenter, xSecond, ySecond);     // Draw minute hand
        int mLength = (int)(clockRadius * 0.65);
        int xMinute = (int)(xCenter + mLength *
          Math.sin(minute * (2 * Math.PI / 60)));
        int yMinute = (int)(yCenter - mLength *
          Math.cos(minute * (2 * Math.PI / 60)));
        g.setColor(Color.blue);
        g.drawLine(xCenter, yCenter, xMinute, yMinute);     // Draw hour hand
        int hLength = (int)(clockRadius * 0.5);
        int xHour = (int)(xCenter + hLength *
          Math.sin((hour % 12 + minute / 60.0) * (2 * Math.PI / 12)));
        int yHour = (int)(yCenter - hLength *
          Math.cos((hour % 12 + minute / 60.0) * (2 * Math.PI / 12)));
        g.setColor(Color.green);
        g.drawLine(xCenter, yCenter, xHour, yHour);
      }   public void setCurrentTime() {
        // Construct a calendar for the current date and time
        Calendar calendar = new GregorianCalendar();     // Set current hour, minute and second
        this.hour = calendar.get(Calendar.HOUR_OF_DAY);
        this.minute = calendar.get(Calendar.MINUTE);
        this.second = calendar.get(Calendar.SECOND);
      }   public Dimension getPreferredSize() {
        return new Dimension(200, 200);
      }
    }