A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陶辰 中级黑马   /  2012-11-20 10:01  /  1325 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

运行起来会闪烁。把
super.paint(g);去掉的话 钟面上走过的指针画的线不会消失。求解答拜托了
package com.ttc;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class test10 extends JFrame {
   
    private JPanel contentPane;
    Point2D.Double[] points = new Point2D.Double[60];
    Point p = new Point(300,300);
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                        test10 frame = new test10();
                    frame.setVisible(true);
                  
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
   
    public test10() {
        addWindowListener(new WindowAdapter() {
            public void windowActivated(WindowEvent e) {
                do_this_windowActivated(e);
            }
        });
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 302);
        
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));
    }
   
    public void paint(Graphics g){
        super.paint(g);
        int radius = 200;
        g.setColor(Color.blue);
        for(int i=0;i<=59;i++){
            points[i] = new Point2D.Double(p.x+radius*Math.sin(Math.PI/30*i),p.y-radius*Math.cos(Math.PI/30*i));      
        }
        
        for(int i=0;i<=59;i++){
            if(i%5==0){
                g.fillOval((int)points[i].x-8, (int)points[i].y-8, 16, 16);
            }else{
                g.fillOval((int)points[i].x-4,(int)points[i].y-4,8,8);
            }   
         }
            
        Calendar time = new GregorianCalendar();
        int hour = time.get(Calendar.HOUR);
        int minute = time.get(Calendar.MINUTE);
        int second = time.get(Calendar.SECOND);
        
        Graphics2D g1 = (Graphics2D)g;
        g1.setColor(Color.green);
        g1.draw(new Line2D.Double(p,points[second]));
        
        g1.setColor(Color.blue);
        g1.draw(new Line2D.Double(p,points[minute]));
        
        g1.setColor(Color.red);
        g1.draw(new Line2D.Double(p,points[hour*5+minute/12]));   
    }
   
    protected void do_this_windowActivated(WindowEvent e) {
        new Thread() {
            public void run() {
                while (true) {
                    repaint();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
        }.start();
    }


}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1

查看全部评分

1 个回复

倒序浏览
本帖最后由 奚华 于 2012-11-20 11:00 编辑

JFrame的paint方法继承自Window,Window的paint方法负责绘制Window这个容器里的子组件,如果你不调用super.paint(g) 那么JFrame里的面板内容窗格就不会重新绘制,原来的画面保留下来,相当于没有刷新画面!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马