重写Canvas绘制方法内联时,图形NullPointerException

时间:2014-06-18 20:05:22

标签: java canvas awt

所以我试图创建一个Canvas,并重写内联的paint方法,但是我在Canvas上得到了一个N​​ullPointerException'图形。

Canvas c = new Canvas(){
    @Override
    public void paint(Graphics g){
        g.setColor(Color.BLACK);
        g.drawString("Canvassed Window", 100, 100);
    }
};

NullPointerException来自

g.setColor(Color.BLACK);

我要创建一个继承自Canvas的新类,但我想知道是否有人知道它正在这样做的原因。我怀疑它是因为Canvas还没有被初始化。

我也想知道是否有人知道它的解决方法,我试着写一些看起来像

的东西
private boolean isInit = false;
init(){
    isInit = true;
}

然后在paint方法中在顶部放置一行代表

if(!isInit) return;

但是当我稍后尝试调用init时,它并不想知道,它只是错误并说init不在Canvas类中,我猜我只能覆盖这种方法。

编辑:

我有一个Window类

import java.awt.Canvas;
import java.awt.Frame;

@SuppressWarnings("serial")
public class Window extends Frame{

    public Window(int width, int height, int locationX, int locationY) {
        setSize(width, height);
        setLocation(locationX, locationY);
        setResizable(false);
        setTitle("Window");
        setVisible(true);
    }
    public Window(int width, int height, int locationX, int locationY, String title){
        Window w = new Window(width, height, locationX, locationY);
        w.setTitle(title);
    }
    public Window(int width, int height, int locationX, int locationY, String title, Canvas c){
        Window w = new Window(width, height, locationX, locationY, title);
        w.add(c);
    }

} 

这是我的主要方法,我在其中创建一个新的Window实例:

public static void main(String[] args){
    Canvas c = new Canvas(){
        @Override
        public void paint(Graphics g){
            g.setColor(Color.BLACK);
            g.drawString("Canvassed Window", 100, 100);
        }
    };
    new Window(800, 600, 200, 100, "CanvassedWindow", c);
}

我正在获得一个窗口或#34; Frame"出现,正确的尺寸,尺寸和标题,但它似乎没有绘制字符串,并且有一个NPE。我没有做任何其他事情,我所拥有的只是我主要方法的包装类。

1 个答案:

答案 0 :(得分:1)

因此,根据您的示例,Window类将创建三个新窗口,其中只有一个可见,而不是您将Canvas添加到...

当您致电new Window(800, 600, 200, 100, "CanvassedWindow", c);时,会创建WindowJFrame)的新实例,这是#1窗口,但它不可见......

public Window(int width, int height, int locationX, int locationY, String title, Canvas c)构造函数然后创建另一个WindowJFrame)实例,这是#2窗口,但它不可见......

然后调用public Window(int width, int height, int locationX, int locationY, String title),这会创建另一个Window,这实际上是可见的...... {/ p>

这是因为构造函数Window w = new Window(width, height, locationX, locationY);是唯一一个实际设置框架属性并使其可见的构造函数...

这可能导致一些奇怪的道路......它确实对我有用......

相反,你应该链接你的构造函数,例如......

public class Window extends Frame{

    public Window(int width, int height, int locationX, int locationY) {
        setSize(width, height);
        setLocation(locationX, locationY);
        setResizable(false);
        setTitle("Window");
        setVisible(true);
    }
    public Window(int width, int height, int locationX, int locationY, String title){
        this(width, height, locationX, locationY);
        setTitle(title);
    }
    public Window(int width, int height, int locationX, int locationY, String title, Canvas c){
        this(witdth, height, locationX, locationY, title);
        add(c);
    }

}