日期:2014-05-20  浏览次数:20841 次

java绘图时出现的空指针异常问题
我想用绘图功能在一个Frame中画出两个图形,该图形名字一个为MyTank,另一个叫EnermyTank,他们有共同的父类Tank,绘图方法定义在父类中paintTank(Graphics g),该方法调用paint(Graphics g)方法。其中g是在MainFrame中创建的。在运行时出现空指针异常,请问程序错在哪里?
具体代码如下:
第一个文件TankClass.java
import java.awt.*;
import javax.swing.*;
public abstract class TankClass extends Frame{
private int x,y;//定义坦克的位置
private int type;//定义坦克的类型
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
//画出坦克
protected void paintTank(Graphics g){
//根据坦克类型决定坦克颜色
if(this.type==0){
g.setColor(Color.red);
}
else if(this.type==1){
g.setColor(Color.blue);
}
paint(g);
}
public void paint(Graphics g){
g.fillOval(this.x, this.y, 20, 20);
}
}
class MyTank extends TankClass{
}
class EnermyTank extends TankClass{
}


第二个文件MainFrame.java
import java.awt.*;
import javax.swing.*;
public class MainFrame extends Frame{
MyTank mt;
EnermyTank et;
Graphics g;
public MainFrame(){
//创建图形对象
g=getGraphics();
mt=new MyTank();
et=new EnermyTank();
mt.setX(30);
mt.setY(30);
mt.setType(0);
mt.paintTank(g);
et.setX(70);
et.setY(70);
et.setType(1);
et.paintTank(g);
//this.add(mainp);
this.setSize(100, 100);
this.setVisible(true);

}
public static void main(String[] args) {
MainFrame mf=new MainFrame();

}

}


------最佳解决方案--------------------
http://bbs.csdn.net/topics/60046839
------其他解决方案--------------------
多谢楼上,总结本次错误原因:getGraphics()一般要写在一些响应事件函数中比如鼠标事件中才有效。
Graphics类需要依赖某个组件,如果组件是Component的子类,则可以覆盖父类中paint(Graphics g)方法绘制图形,此方法可以得到一个g对象。所以我将前面的MainFrame类修改了一下,结果就正确了
import java.awt.*;
import javax.swing.*;
public class MainFrame extends Frame{
//JPanel mainp;
MyTank mt;
EnermyTank et;
Graphics g;
public void paint(Graphics g){
mt.paintTank(g);
et.paintTank(g);
}
public MainFrame(){
//mainp=new JPanel();
//mainp.setBackground(Color.BLACK);
//创建图形对象
g=getGraphics();
mt=new MyTank();
et=new EnermyTank();
mt.setX(30);
mt.setY(30);
mt.setType(0);

et.setX(70);
et.setY(70);
et.setType(1);

//this.add(mainp);
this.setSize(100, 100);
this.setVisible(true);

}
public static void main(String[] args) {
MainFrame mf=new MainFrame();

}

}
这里我不是用getGraphics()方法另外生成一个g,而是用paint(Graphics g)方法得到这个g.