public void paintComponent(java.awt.Graphics g)
    {
        super.paintComponent(g);
        g.drawOval(center.x, center.y, radius, radius);
    }    public void mouseClicked(MouseEvent e) 
    {
        center = new Point(50,50);
        radius = 30;
        repaint();
    }    想在单击鼠标后更新center radius变量 再通过repaint()来调用paintComponent()来重画圆形 经过调试发现单击鼠标后确实调用了repaint(),但是程序并没有转想执行paintComponent() 怎么才能达到我的目的 让程序执行paintComponent()这两个函数所在类继承了JPanel

解决方案 »

  1.   

    public void paint(Graphics g)
      

  2.   

    public void paint(Graphics g)
    也不行
      

  3.   

    class Graphics extends JPanel
                    implements Observer , MouseListener
    {  
        private int radius;
        private Point center;
        
        public Graphics()
        {
            center = new Point(10,10);
            radius = 10;
        }
        public void paintComponent(java.awt.Graphics g)
        {
            super.paintComponent(g);
            g.drawOval(center.x, center.y, radius, radius);
            Toolkit.getDefaultToolkit().beep(); 
        }    public void update(Observable o, Object arg) 
        {
            Text t = (Text)o;
            this.radius = t.getRadius();
        }    public void mouseClicked(MouseEvent e) 
        {
            center = new Point(50,50);
            radius = 30;
            //Toolkit.getDefaultToolkit().beep();
            repaint();
        }
    }// 下面这个类就是把继承自JPanel类的Graphics类加如到JFrame中
    // 单击鼠标后应该可以看到面版上的圆形大小发生变化 但是程序并没有执行paintComponent
    // 函数
    public class Controller 
    {
        JFrame f = null;
        Graphics gra = null;
        
        Controller()
        {
            gra = new Graphics();
            f = new JFrame("Exp3");        
            Container content = f.getContentPane();       
            gra.addMouseListener(new Graphics());
            content.add(gra);
            f.setSize(700,500);
            f.setVisible(true);
            
            f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            });
        }
        public static void main(String agrs[])
        {
            new Controller();
        }
    }
      

  4.   

    谁能说说上面那个程序在单击鼠标执行repaint()后为什么不能执行paintComponent()函数
      

  5.   

    public class Controller 
    {
    JFrame f = null;
    Graphics gra = null;Controller()
    {
    gra = new Graphics();
    f = new JFrame("Exp3"); 
    Container content = f.getContentPane(); 
    gra.addMouseListener(new Graphics());////-->这儿错了,要写成gra.addMouseListener(gra);
    content.add(gra);
    f.setSize(700,500);
    f.setVisible(true);
      

  6.   

    如果你不是让它自己监听自己,那么调用的repaint就是那个new Graphics类里的paintComponent.还有,最好不要用Graphics来作为你写类的类名,这不是一个好习惯,虽然你意识到了要在paint里写java.awt.Graphics.
      

  7.   

    Graphics已经改为Graphic 把repanint()放在updata()里就可以了 但是还是不知道是为什么 DOC里说当组件不可显示时getGraphics将返回null 我想这时repaint()将不会调用paintComponent() (DOC里没这么说) 可是“组件不可显示”该怎么理解呢
      

  8.   

    按hoverlees(好棒)的方法改过之后,问题解决了   
    但还是有一个问题不明白 按照原先我的做法——gra.addMouseListener(new Graphics());在单击鼠标时确实响应了单击事件(我在public void mouseClicked(MouseEvent e) {}加了Toolkit.getDefaultToolkit().beep();且能听到声音)可就是执行repaint()时程序流程走不到paintComponent()