当前位置:编程学习 > JAVA >>

getGraphics()抛空指针异常

Image tempBufferedImage = this.createImage(this.getWidth(), this.getWidth());
Graphics2D g2d=null;
try {
g2d = (Graphics2D) tempBufferedImage.getGraphics();   //①
//g2d = (Graphics2D)getGraphics();
} catch (NullPointerException e) {
System.out.println("116");
}

①处总是抛出空指针异常,也就是总是走catch,怎么能解决这个问题。
createImage getGraphics Graphics2D --------------------编程问答-------------------- 此类继承JPanel --------------------编程问答-------------------- 你检查一下看看tempBufferedImage这个引用是不是空的 --------------------编程问答-------------------- 这个getGraphics方法返回的是个空值。jdk提供的方法,但是。。。 --------------------编程问答--------------------  g2d = tempBufferedImage.createGraphics();   

改成这样试试 --------------------编程问答-------------------- 由于没有完整的代码,自己补充了部分代码。

运行后,并没有抛出异常,请楼主给出完整代码。

我的代码如下:
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.JPanel;

public class ImageDemo1 extends JPanel
{
public void createImg()
{
Image tempBufferedImage = this.createImage(this.getWidth(),
this.getWidth());
Graphics2D g2d = null;
try
{
g2d = (Graphics2D) tempBufferedImage.getGraphics(); // ①
// g2d = (Graphics2D)getGraphics();
} catch (NullPointerException e)
{
System.out.println("116");
}
}

/**
 * @param args
 */
public static void main(String[] args)
{
ImageDemo1 id1 = new ImageDemo1();
id1.createImg();
}

}
--------------------编程问答-------------------- sorry,搞错了。另外,
在eclipse中运行时,会出现null并不奇怪。

(1)参考JPanel中的createImage()方法的说明:如果组件不可显示,则该方法返回null

(2)在楼主的代码中,自定义JPanel类并不能单独显示,因为JPanel只是一个容器组件,而Java的组件显示是要在窗体中才能显示,必须把JPpanel加入到窗体中去后,调用窗体的setVisible(true)才能显示。

根据以上两点,可有结论:
    因为自定义的JPanel类并不在任一个窗体中,如JFrame,所以它并不能显示出来。
    导致的结果是:
        通过自定义的JPanel类组件调用createImage()方法,得到的只是null

以下是在自定义的JFrame中使用createImage()方法,并没有出现异常。因为JFame可以独立显示出来。

代码:
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.JFrame;

public class ImageDemo1 extends JFrame
{
private int width = 200;
private int height = 200;

public ImageDemo1()
{
setTitle("ImageDemo1");
setSize(300, 300);
setVisible(true);

setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public Image createImg()
{
Image tempBufferedImage = this.createImage(this.width,
this.height);
Graphics2D g2d = null;
try
{
g2d = (Graphics2D) tempBufferedImage.getGraphics(); // ①
// g2d = (Graphics2D)getGraphics();
} catch (NullPointerException e)
{
System.out.println("116");
}

return tempBufferedImage;
}

/**
 * @param args
 */
public static void main(String[] args)
{
ImageDemo1 id1 = new ImageDemo1();
id1.createImg();
}

}

--------------------编程问答-------------------- 补充:

(1)JPanel通过继承Component类,从而拥有createImage()方法

(2)添加的代码并不影响楼主的意图
    createImage()方法中的参数并没有使用getWidth()方法,而是直接使用自定义的属性width和height,也可以在其中增加方法getWidth()和getHeight(),来获取width和height属性
     --------------------编程问答-------------------- getGraphics
public abstract Graphics getGraphics()创建供绘制闭屏图像(off-screen image)使用的图形上下文。此方法仅供闭屏图像调用。 

返回:
绘制闭屏图像的图形上下文。   

你那个Image对象是闭屏图像吗?



--------------------编程问答--------------------
引用 4 楼 huntor 的回复:
 g2d = tempBufferedImage.createGraphics();   

改成这样试试


Image对象貌似不能用createGraphics();方法 我查了API文档 --------------------编程问答--------------------
引用 9 楼 wuyanxue 的回复:
Quote: 引用 4 楼 huntor 的回复:

 g2d = tempBufferedImage.createGraphics();   

改成这样试试


Image对象貌似不能用createGraphics();方法 我查了API文档

被变量名迷惑了,以为是个BufferedImage。
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,