import java.awt.*;
import javax.swing.*;
import java.awt.Graphics;class Test extends JFrame{
  public static void main(String args[]){
    Test frame = new Test();
    frame.setSize(400,300);
    frame.setVisible(true);  
  }
  public void paint(Graphics g){
    g.drawString("abc",10,10);
    System.out.println("paintint..");
  }
 public void paintComponent(Graphics g){
    System.out.println("in paint component...");
    g.drawString("bcd",20,20);
 }
}paint()调用了 为什么abc却没显示,还有 什么时候调用paintComponent方法呢?

解决方案 »

  1.   

    你这个程序设计上就有很大的问题,
    第一,如果要在JFrame上添加什么东西或者绘制图形,需要获得其contentPane在contentPane上面操作才行,直接操作add或者重绘是没有意义的
    第二,重新paint方法的时候没有调用super.paint(g),导致图形界面实际什么也没有
    第三,JFrame不是JComponent的子类,因此根本就不会有paintComponent(Graphics g)的调用,因此你的第二个问题根本不存在,什么时候都不调用paintComponent(Graphics g)方法,除非你程序里面主动调用下面给你一个能显示出来abc字符串的例子,你看看import java.awt.*;
    import javax.swing.*;
    import java.awt.Graphics;class Test extends JFrame{
        public static void main(String args[]){
            Test frame = new Test();
            frame.setSize(400,300);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public void paint(Graphics g){
            super.paint(g);
            Container c=this.getContentPane();
            Graphics gg=c.getGraphics();
            gg.drawString("abc",10,10);
    //        this.repaint();
            System.out.println("paintint..");
        }
        //这段代码除非显式地直接调用,否则什么时候都不会调用
    //    @Override 因为paintConponent方法没有在JFrame父类定义,@Override写在这里报错
        public void paintComponent(Graphics g){
            System.out.println("in paint component...");
            g.drawString("bcd",20,20);
        }
    }
      

  2.   

    感谢你的解释,明白点了,但是我要是再jframe上添加一个panel之后,drawString 没有画在panel上,需要在paint里将g得到panel的面板的引用??import java.awt.*;
    import javax.swing.*;
    import java.awt.Graphics;class Test extends JFrame{
      public static void main(String args[]){
        Test frame = new Test();
        frame.setSize(400,300);
        frame.setVisible(true);
        frame.add(new Panel());  
        Panel pp = new Panel();
      }
      public void paint(Graphics g){
        //g = this.getContentPane().getGraphics();
       // g = this.pp.getContentPane.getGraphics();
        g.drawString("abc",10,10);
        System.out.println("paintint..");
      }
     public void paintComponent(Graphics g){
        System.out.println("in paint component...");
        g.drawString("bcd",20,20);
     }
    }
      

  3.   

    import java.awt.*;
    import javax.swing.*;
    import java.awt.Graphics;class Test extends JFrame{
        public static void main(String args[]){
            Test frame = new Test();
            JPanel board = new PaintBoard();
            board.setOpaque(false);
            frame.add(board);
            frame.setSize(400,300);
            frame.setVisible(true);
        }    @Override
        public void paint(Graphics g){
            super.paint(g);
            g.drawString("abc",10,10);        System.out.println("paintint..");
        }    private static class PaintBoard extends JPanel{
            @Override
            public void paintComponent(Graphics g){
                super.paintComponent(g);
                System.out.println("in paint component...");
                g.drawString("bcd",20,20);
            }
        }
    }
      

  4.   


    add方法已经被修改了,可以用来添加组件。
      

  5.   

    谢谢提醒,直接add是让人蛋疼的做法
      

  6.   

    打破砂锅问到底了 擦import java.awt.*;
    import javax.swing.*;
    import java.awt.Graphics;class Test extends JPanel{
      public static void main(String args[]){
        Frame frame = new Frame();
        frame.setSize(400,300);
        frame.setVisible(true);  
        Test test = new Test();
        test.setSize(100,100);
        test.setBackground(Color.black);
        test.setVisible(true);
        frame.add(test);
      }
      public void paint(Graphics g){
        //super.paint(g);
        //g = this.getGraphics();
        g.drawString("abc",10,10);
        System.out.println("paintint..");
      }
     public void paintComponent(Graphics g){
        System.out.println("in paint component...");
        g.drawString("bcd",20,20);
     }
    }有继承jpanel类的对象生成 为什么没有调用paintComponent方法,还有 paint()怎么也
      

  7.   

    建议你找本SWING的教材认真看吧,系统化的知识是你最需要的,我们能帮你改出来你要的效果,但是你脑子里面却是一锅粥,因为积累的知识太少
    对照你的代码,看看我改了哪里import java.awt.*;
    import javax.swing.*;
    import java.awt.Graphics;class Test extends JPanel{
        public static void main(String args[]){
            JFrame frame = new JFrame();
            frame.setSize(400,300);
            frame.setVisible(true);
            Test test = new Test();
            test.setSize(100,100);
            test.setBackground(Color.black);
    //    test.setVisible(true);
            frame.add(test);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }    @Override
        public void paint(Graphics g){
            super.paint(g);
            //g = this.getGraphics();
            g.drawString("abc",10,10);
            System.out.println("paintint..");
        }    @Override
        public void paintComponent(Graphics g){
            System.out.println("in paint component...");
            g.drawString("bcd",20,20);
        }
    }