我写了一个小时钟,但有点遗憾,小时钟 的 针走过之后会留下痕迹,有没有什么办法擦除痕迹呢?(当这里最小化一下框架,相应的痕迹会不见了(这又是为什么?))import java.awt.geom.*;
import java.awt.*;
import javax.swing.event.*;
import javax.swing.*;
import java.util.*;public class JTextFieldText { public static void main(String[] args) { JTextFieldFrame frame = new JTextFieldFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); }}class JTextFieldFrame extends JFrame { private static final int WIDTH = 400;
private static final int HEIGHT = 300; public JTextFieldFrame() {
setSize(WIDTH, HEIGHT);
setTitle("文本域测试"); Container con = getContentPane(); ClockPanel clockPane = new ClockPanel();
JTextFieldPanel jtext = new JTextFieldPanel(clockPane); con.add(jtext, BorderLayout.SOUTH);
con.add(clockPane, BorderLayout.CENTER);
}
}
class JTextFieldPanel extends JPanel { private JTextField hourText;
private JTextField minuteText;
private ClockPanel clockPanel;
private int hour;
private int minute;
private Runnal r;
private JLabel lable;
private JLabel lable2;
private JLabel lable3;
private JTextField secondText;
DocumentListener listener; public JTextFieldPanel(ClockPanel clockPanel) {
this.clockPanel = clockPanel;
hourText = new JTextField(3);
minuteText = new JTextField(3);
lable = new JLabel("小时");
lable2 = new JLabel("分钟");
lable3 = new JLabel("秒");
secondText = new JTextField(3);
r = new Runnal();

r.start();

listener = new ClockListener();
hourText.getDocument().addDocumentListener(listener);
minuteText.getDocument().addDocumentListener(listener);

add(lable);
add(hourText);
add(lable2);
add(minuteText);
add(lable3);
add(secondText);
} public void setClock() {
try { hour = Integer.parseInt(hourText.getText().trim());
minute = Integer.parseInt(minuteText.getText().trim());
clockPanel.setTime(hour, minute);
} catch (NumberFormatException r) { }
} private class ClockListener implements DocumentListener { public void insertUpdate(DocumentEvent e) {
setClock();
} public void removeUpdate(DocumentEvent e) {
setClock();
} public void changedUpdate(DocumentEvent e) { } } class Runnal extends Thread { public void run() {
while (true) {

String temp = new Date().toString();
String t = temp.substring(11, temp.indexOf('C'));
t = t.trim();
String[] time = t.split(":");

hourText.setText(time[0]);
minuteText.setText(time[1]);
secondText.setText(time[2]); try {
sleep(1000);
setClock(); } catch (InterruptedException e) {
e.printStackTrace();
}
}
} }}/*
 * 画出时钟
 */
class ClockPanel extends JPanel { private double minutes = 0;
private double RADIUS = 100;
private double MINUTE_HAND_LENGTH = 0.8 * RADIUS;
private double HOUR_HAND_LENGTH = 0.6 * RADIUS; public void paintComponent(Graphics g) {
super.paintChildren(g);
Graphics2D g2 = (Graphics2D) g;
Ellipse2D cirlce = new Ellipse2D.Double(0, 0, 2 * RADIUS, 2 * RADIUS);
g2.draw(cirlce);
double hourAngle = Math.toRadians(90 - 360 * minutes / (12 * 60));
drawHand(g2, hourAngle, HOUR_HAND_LENGTH);
double minuteAngle = Math.toRadians(90 - 360 * minutes / 60);
drawHand(g2, minuteAngle, MINUTE_HAND_LENGTH);
} public void drawHand(Graphics2D g2, double angle, double handLength) {
Point2D end = new Point2D.Double(RADIUS + handLength * Math.cos(angle),
RADIUS - handLength * Math.sin(angle));
Point2D center = new Point2D.Double(RADIUS, RADIUS);
g2.draw(new Line2D.Double(center, end));
} public void setTime(int h, int m) {
minutes = h * 60 + m;
repaint(); }}

解决方案 »

  1.   

    面板(或容器) repaint()一下
      

  2.   

    对的,窗体需要重新绘制一下,你可以调用repaint()方法重新绘制窗体,不然原来的线不会被搽掉的
      

  3.   

    lz可以试试没60秒刷新一次frame,我原先也遇到过这种问题,比如拖动下窗口或者最小化,然后问题虚影就没了
      

  4.   


    public void paintComponent(Graphics g) {
    super.paintChildren(g);//这里错了,调用super.paintCompoent(g);
    Graphics2D g2 = (Graphics2D) g;
    Ellipse2D cirlce = new Ellipse2D.Double(0, 0, 2 * RADIUS, 2 * RADIUS);
    g2.draw(cirlce);
    double hourAngle = Math.toRadians(90 - 360 * minutes / (12 * 60));
    drawHand(g2, hourAngle, HOUR_HAND_LENGTH);
    double minuteAngle = Math.toRadians(90 - 360 * minutes / 60);
    drawHand(g2, minuteAngle, MINUTE_HAND_LENGTH);
      

  5.   

    还有就是你在Runnal 类中的获得
    小时 分钟 秒的代码不要那么写
    应为在不同的环境下日期输出的字符串时不同
    特别是这句String t = temp.substring(11, temp.indexOf('C')); 
    估计是中文环境中的CST
    但在其它环境中就不是C了
    可以改成String t = temp.substring(11, 20);