import javax.swing.*;
import java.awt.*;public class drawonpanel {
  Graphics2D g2d;
  public drawonpanel(JPanel p) {
    g2d =(Graphics2D) p.getGraphics();
    System.out.println("inside of drawonpanel");
   g2d.drawString("i am a boy!",50,50);
  }
}import javax.swing.*;
public class Main {
  JPanel p;
  JFrame f;
  drawonpanel pp;
  public Main() {
    p = new  JPanel();
    f = new JFrame();
    pp = new drawonpanel(p);
    f.getContentPane().add(p);
    f.pack();
    f.show();
  }  public static void main(String args[]){
    new Main();
  }
}
两个类,drawonpanle负责画图,Main负责显示,我把一个JPanle传到drawonpanle里了,但是程序执行到:g2d.drawString("i am a boy!",50,50);
会有异常显示:
java.lang.NullPointerException这个问题如何处理?

解决方案 »

  1.   

    要有frame,比如把JPanel加到JFrame上
      

  2.   


    错了。当时的JPanel应该还没有与Graphics相关联,所以g2d为null
      

  3.   

    i当然会有异常,虽然这个时候你的JPanel已经被构造出来,但是它还是没有图形上下文,
    所以你得到的空指针异常应该是Graphics的对象的空指针
    你可以先让整个窗口显示出来,然后再调用,这样的话就不会出空指针了
      

  4.   

    import javax.swing.*;
    import java.awt.*;class drawonpanel extends JPanel{
      Graphics2D g2d;
      public drawonpanel() {
      }
      public void paint(Graphics g){
        g2d =(Graphics2D) g;
        System.out.println("inside of drawonpanel");
    g2d.drawString("i am a boy!",50,50);
      }
    }public class Main {
      JPanel p;
      JFrame f;
      drawonpanel pp;
      public Main() {
        //p = new  JPanel();
        f = new JFrame();
        pp = new drawonpanel();
        f.getContentPane().add(pp);
        f.pack();
        f.show();
      }  public static void main(String args[]){
        new Main();
      }
    }
      

  5.   

    g2d =(Graphics2D) p.getGraphics();
    System.out.println("inside of drawonpanel");
    这里g2d是null
      

  6.   

    多谢楼上的2个兄弟我改了下,没有异常了,但是还是画不出图形import javax.swing.*;
    import java.awt.*;public class drawonpanel {
      Graphics2D g2d;
      public drawonpanel(JPanel p) {
        g2d =(Graphics2D) p.getGraphics();
         g2d.setBackground(Color.BLUE);
       g2d.drawString("i am a boy!",50,50);
       g2d.drawLine(20,30,100,20);
      }
    }import javax.swing.*;
    public class Main {
      JPanel p;
      JFrame f;
      drawonpanel pp;
      public Main() {
        p = new  JPanel();
        f = new JFrame();
        f.getContentPane().add(p);
        f.pack();
        f.show();
        pp = new drawonpanel(p);
      }  public static void main(String args[]){
        new Main();
      }
    }
      

  7.   

    /*
     * Tests.java
     *
     * Created on 2006年8月15日, 上午11:09
     *
     * To change this template, choose Tools | Template Manager
     * and open the template in the editor.
     */package ss;/**
     *
     * @author lbf
     */
    import java.awt.*;
    import javax.swing.*;
    public class Tests extends JFrame implements Runnable{
        private JPanel jp;
        private int arc;
        private Color c;
        /** Creates a new instance of Tests */
        public Tests(){
            super("test");
            jp=new JPanel();
            this.getContentPane().add(jp,BorderLayout.CENTER);
            this.setBounds(300,300,400,400);
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            new Thread(this).start();
        }
        public void run(){
            while(true){
                try{
                    arc++;
                    Thread.sleep(10);
                    draw(jp);
                    if(arc==360){
                        arc=0;
                        c=new Color((int)(Math.random()*0xffffff));
                    }
                        
                }
                catch(Exception exe){
                    exe.printStackTrace();
            }
        }
        }
        private void draw(JPanel p){
            Graphics g=p.getGraphics();
            g.setColor(c);
            g.fillArc(50,50,100,100,0,arc);
        }
        public static void main(String args[]){
            new Tests();
        }
    }
    你试试这个,和你实现是一样的,我这里用了一个线程 一直在画,这样可以看得更清楚些
      

  8.   

    f.getContentPane().add(p);之前加上
            f.setSize(300,300);
            f.setLayout(new BorderLayout());
    应该就行了
      

  9.   

    to:Top  
     lbfhappy(千里冰封)  非常感性你的帮助,现在我可以绘图了,但是当绘制图形的窗口大小改变后,图形就不见了,这个如何解决呢?谢谢
      

  10.   

    这个是没有办法的事情,因为你的图形窗口大小一变,系统就会自动调用repaint()方法
    这个时候,你的绘制图形不是在paint方法里定义的,所以会消失掉
    最好的办法就是重写paint方法,如果是swing下面的组件,那就重写paintComponent方法
    这样的话,就不会消失了
      

  11.   

    重写paintComponent方法,呵呵,如果是我的代码,那么在重写paintComponent方法里面该如何写呢?