当前位置: 代码迷 >> J2SE >> 急切! 关于 Graphics 类 返回空指针的有关问题
  详细解决方案

急切! 关于 Graphics 类 返回空指针的有关问题

热度:743   发布时间:2016-04-23 20:42:10.0
急切求助!!! 关于 Graphics 类 返回空指针的问题
本帖最后由 u014246256 于 2014-05-26 12:18:28 编辑
//这些代码就是想在frame 窗口中画一条直线。

一.  返回空指针的错误代码。

public class Demo
{
    public static void main(String[] args)
    {
        Frame   f   = new Frame();
        f.setBounds(300,200,600,400);
       
        f.getGraphics().drawLine(1,1,100,100);   //这句话在编译时通过,但运行时却返回空指针异常
  //好像是getGraphics()方法没有获得Graphics对象。
        f.setVisible(true);
}


//但是这些代码却能正确执行。

二.   正确代码。

public class Demo
{
    public static void main(String[] args)
    {
        Frame   f   = new Frame();
        f.setBounds(300,200,600,400);
 
 //先创建一个监听器,并注册到f中,
//再通在监听器中通过getSource()得/到 f,然后再调用getGraphics()方法就行了。
//这不相当于绕了一个弯路吗?       
       f.addMouseListener(new MouseAdapter(){           
             public void mousePressed(MouseEvent   e)
             {
                     e.getSource().getGraphics().drawLine(1,1,100,100);
              }
         });
                                                                                         
        f.setVisible(true);
}


//怎样直接就能在f中画图呢???


还有就是另一个问题:

我自定义一个类 叫 t  让他继承Frame 类,这样我覆盖 paint()方法,这个方法不是在对象建立死自动调用的吗?这样在 t 类中去画图,根本不用考虑产生Graphics对象的问题。(因为paint()自动执行,所以也就不用我调用paint(),当然也就不用我建立Graphics对象来给paint传递实际参数。) 接下来请看代码:
class t extends Frame
{
    public void paint(Graphics g)
    {
        g.drawLine(1,1,70,80); 
    }
}
public class Demo
{
    public static void main(String[] args)
    {
        t   f   =   new t ();
        f.setBounds(300,200,600,400);
       f.setVisible(true);       
     }
}


不过这种画图方式不被动吗?因为是在建立对象时自动调用的paint()方法。

总结起来:就是关于Graphics类 产生对象的问题。
------解决方案--------------------
用一个方法就要了解一个方法的特性,何况你遇到错误了还不仔细研究一下那个方法
下面是Javadoc关于这个方法的介绍
Creates a graphics context for this component. This method will return null if this component is currently not displayable.
写得很清楚了,当component当前没有显示的时候,会返回null
所以你要先setVisible
还有一个问题,如果你只是drawLine画一次,那你是看不到效果的,因为窗体是不断重绘的,也就是内容是不断清空的,如果要看到效果,你就要不断的drawLine,像下面这样,但这样的做法是不好的,正确的应该是重写paint方法。
		Frame f = new Frame();
f.setSize(400, 300);
f.setVisible(true);

Graphics g = f.getGraphics();

while (true) {
g.drawLine(1, 1, 100, 100);
}
  相关解决方案