问题描述:
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; }
}
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; }
}
VC里是这么做的,java中如何实现就不知道了
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;
}
Thank you!你是通過設置顏色來解決這個問題的
我也想到了一個方法,我是通過設定時針,分針 ,秒針
然後轉響應角度來實現的
不過,很感謝你