问题描述:
clock运行的时候,为什么秒针,分针,时针都不能做到唯一,in other words,每次都会 画上新的秒针,分针,时针
代码如下:
clockTest.javapackage swingstudy.swing;import java.awt.*;
import java.awt.event.*;
import java.util.*;import javax.swing.*;
import javax.swing.Timer;
import javax.swing.event.*;/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class clockTest {
    clockPanel clock;
    JFrame frame = new JFrame();
    int hour = 0;
    int minute = 0;
    int second = 0;
    JPanel txtTime = new JPanel();
    JLabel lblTime = new JLabel("The time now is:");
    JTextField txtYear = new JTextField();
    JLabel lblYear = new JLabel("-");
    JTextField txtMonth = new JTextField();
    JLabel lblMonth = new JLabel("-");
    JTextField txtDay = new JTextField();
    JLabel lblDay = new JLabel(",");
    JTextField txtHour = new JTextField();
    JLabel lblHour = new JLabel(":");
    JTextField txtMinute = new JTextField();
    JLabel lblMinute = new JLabel(":");
    JTextField txtSecond = new JTextField();
    Calendar now ;    public clockTest() {
        init();
    }    public void init() {
        DocuListener listener = new DocuListener();
        clock = new clockPanel();
        txtTime.setLayout(new FlowLayout());
        txtTime.add(lblTime);        txtTime.add(txtYear);
        txtTime.add(lblYear);        txtTime.add(txtMonth);
        txtTime.add(lblMonth);        txtTime.add(txtDay);
        txtTime.add(lblDay);        txtTime.add(txtHour);        txtTime.add(lblHour);        txtTime.add(txtMinute);
        txtTime.add(lblMinute);
        txtTime.add(txtSecond);
        txtSecond.getDocument().addDocumentListener(listener);        frame.setPreferredSize(new Dimension(400, 400));
        frame.setLayout(new BorderLayout());
        frame.getContentPane().add(clock, BorderLayout.CENTER);
        frame.getContentPane().add(txtTime, BorderLayout.SOUTH);
        initTextField();
        frame.pack();
        frame.setVisible(true);    }    public void initTextField() {         ActionListener action=null;
        try {
            now=Calendar.getInstance();
            txtYear.setText(String.valueOf(now.get(Calendar.YEAR)));
            txtMonth.setText(String.valueOf(now.get(Calendar.MONTH)+1));
            txtDay.setText(String.valueOf(now.get(Calendar.DATE)));
            txtHour.setText(String.valueOf(now.get(Calendar.HOUR)));
            txtMinute.setText(String.valueOf(now.get(Calendar.MINUTE)));
            txtSecond.setText(String.valueOf(now.get(Calendar.SECOND)));
            action = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                     now=Calendar.getInstance();
                    txtYear.setText(String.valueOf(now.get(Calendar.YEAR)));
                    txtMonth.setText(String.valueOf(now.get(Calendar.MONTH)+1));
                    txtDay.setText(String.valueOf(now.get(Calendar.DATE)));
                    txtHour.setText(String.valueOf(now.get(Calendar.HOUR)));
                    txtMinute.setText(String.valueOf(now.get(Calendar.MINUTE)));
                    txtSecond.setText(String.valueOf(now.get(Calendar.SECOND)));                }
            };        } catch (NumberFormatException ex) {
            ex.printStackTrace();        }
        Timer time = new Timer(1000, action);
        time.start();
    }
    class DocuListener implements DocumentListener {
        public void insertUpdate(DocumentEvent e) {
            setClock();
        }        public void removeUpdate(DocumentEvent e) {
        }        public void changedUpdate(DocumentEvent e) {
        }
    }
    public void setClock() {
        hour = Integer.parseInt(txtHour.getText());
        minute = Integer.parseInt(txtMinute.getText());
        second = Integer.parseInt(txtSecond.getText());
        clock.setTime(hour, minute, second);
        clock.repaint();
    }
    public static void main(String[] args) {
        new clockTest();
    }
}clockPanel.java package swingstudy.swing;import javax.swing.JPanel;
import java.awt.geom.Ellipse2D;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.awt.Graphics;
import java.awt.geom.Line2D;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.Timer;public class clockPanel extends JPanel {
    final double RADIUS = 100;
    final double HOUR_HAND_LENGTH = 0.4 * RADIUS;
    final double MINUTE_HAND_LENGTH = 0.6 * RADIUS;
    final double SECOND_HAND_LENGTH = 0.8 * RADIUS;
    final double SMALL_HAND_LENGTH = 5;
    double minutes = 0;
    double seconds = 0;
    Ellipse2D circle = new Ellipse2D.Double(0, 0, RADIUS * 2,
                                            RADIUS * 2);
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.draw(circle);
        double angle = Math.toRadians(90);
        for (int i = 0; i < 60; i++) {
            if (i % 5 == 0) {
                drawsmallhand(g2, angle, 0.7 * SMALL_HAND_LENGTH);
            } else if (i % 15 == 0) {
                drawsmallhand(g2, angle, SMALL_HAND_LENGTH);
            } else {
                drawsmallhand(g2, angle, 0.5 * SMALL_HAND_LENGTH);
            }            angle -= Math.toRadians(6);
        }        //draw hour_hand
        double hourAngle = Math.toRadians(90 -
                                          seconds * 360 / (12 * 60 * 60));
        drawhand(g2, hourAngle, HOUR_HAND_LENGTH);        //draw hour_hand
        double minuteAngle = Math.toRadians(90 - seconds * 360 / (60 * 60));
        drawhand(g2, minuteAngle, MINUTE_HAND_LENGTH);        //draw second_hand
        double secondAngle = Math.toRadians(90 - seconds * 360 / 60);
        drawhand(g2, secondAngle, SECOND_HAND_LENGTH);    }    /*
            畫手錶刻度
     */
    public void drawsmallhand(Graphics2D g2, double angle, double length) {        Point2D end = new Point2D.Double(RADIUS + RADIUS * Math.sin(angle),
                                         RADIUS - RADIUS * Math.cos(angle));
        Point2D start = new Point2D.Double(RADIUS +
                                           (RADIUS - length) *
                                           Math.sin(angle),
                                           RADIUS -
                                           (RADIUS - length) *
                                           Math.cos(angle));
        Line2D line = new Line2D.Double(start, end);
        g2.draw(line);    }    /**
     * 畫指針
     * @param g2 Graphics2D
     * @param angle double
     * @param length double
     */
    public void drawhand(final Graphics2D g2, double angle, double length) {
        Point2D end = new Point2D.Double(RADIUS + length * Math.cos(angle),
                                         RADIUS - length * Math.sin(angle));
        Point2D center = new Point2D.Double(RADIUS, RADIUS);
        Line2D line = new Line2D.Double(center, end);
        g2.draw(line);    }    public void setTime(int h, int m, int s) {
        seconds = h * 3600 + m * 60 + s;    }
}

解决方案 »

  1.   

    应该更新一下绘图区,在从新绘制新的表盘加时针、分针、秒针。
    VC里是这么做的,java中如何实现就不知道了
      

  2.   

    只改变了clockPanel.java,改动如下:1)增加成员变量
        Line2D hourHand, minuteHand, secondHand;
    2)修改了方法 paintComponent()
    3)更改
         public void drawhand(final Graphics2D g2, double angle, double length){}
      为:
        public Line2D getHand(double angle, double length) {}///////////////////////////////////////////////////////////////////////////    // 改动1
        Line2D hourHand, minuteHand, secondHand;
        
        // 改动2
        public void paintComponent(Graphics g) {
            super.paintComponents(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.draw(circle);
            double angle = Math.toRadians(90);
            for (int i = 0; i < 60; i++) {
                if (i % 5 == 0) {
                    drawsmallhand(g2, angle, 0.7 * SMALL_HAND_LENGTH);
                } else if (i % 15 == 0) {
                    drawsmallhand(g2, angle, SMALL_HAND_LENGTH);
                } else {
                    drawsmallhand(g2, angle, 0.5 * SMALL_HAND_LENGTH);
                }            angle -= Math.toRadians(6);
            }        //draw hour_hand
            double hourAngle = Math.toRadians(90 -
                                              seconds * 360 / (12 * 60 * 60));
            
            Color c = g2.getColor();
            Color bk = this.getBackground();
            
            if (hourHand != null) {
             g2.setColor(bk);
             g2.draw(hourHand);
             g2.setColor(c);
            }
            hourHand = getHand(hourAngle, HOUR_HAND_LENGTH);
            g2.draw(hourHand);        //draw hour_hand
            double minuteAngle = Math.toRadians(90 - seconds * 360 / (60 * 60));
            if (minuteHand != null) {
             g2.setColor(bk);
             g2.draw(minuteHand);
             g2.setColor(c);
            }
            minuteHand = getHand(minuteAngle, MINUTE_HAND_LENGTH);
            g2.draw(minuteHand);        //draw second_hand
            if (secondHand != null) {
             g2.setColor(bk);
             g2.draw(secondHand);
             g2.setColor(c);
            }
            double secondAngle = Math.toRadians(90 - seconds * 360 / 60);
            secondHand = getHand(secondAngle, SECOND_HAND_LENGTH);
            g2.draw(secondHand);    }    // 改动 3
        public Line2D getHand(double angle, double length) {
            Point2D end = new Point2D.Double(RADIUS + length * Math.cos(angle),
                                             RADIUS - length * Math.sin(angle));
            Point2D center = new Point2D.Double(RADIUS, RADIUS);
            
            Line2D line = new Line2D.Double(center, end);
            
            return line;
        }
      

  3.   

    To UnAgain():
    Thank you!你是通過設置顏色來解決這個問題的
    我也想到了一個方法,我是通過設定時針,分針 ,秒針
    然後轉響應角度來實現的
    不過,很感謝你