【发布时间】:2014-08-09 06:10:19
【问题描述】:
所以我试图创建一个画布,并覆盖内联的绘制方法,但是我在画布的图形上得到了 NullPointerException。
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类中,我猜我只能以这种方式覆盖方法。
编辑:
我有一个窗口类
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);
}
我得到了一个窗口或“框架”,正确的大小、尺寸和标题,但它似乎没有绘制字符串,并且有一个 NPE。我没有做任何其他事情,我所拥有的只是我的 main 方法的包装类。
【问题讨论】:
-
您的问题和代码比您向我们展示的更多。除非以奇怪的方式使用此代码,否则不应抛出 NPE。还有一个附带问题,为什么是 AWT 而不是 Swing?
-
请向我们展示一个重现问题的最小工作示例。
-
你怎么打电话给
paint()? -
AWT 已经过时了 15 年,它在 15 年前被 Swing 取代,是的,了解 AWT 的工作原理会有所帮助,但我不会是我的第一个电话点。您是否正在使用 getGraphics 并尝试自己调用paint?
-
你有一个构造函数创建自己的实例,这是非常危险的代码,因此你的代码创建了两个窗口。我很确定你不想做你正在做的事情。也许您的意思是调用
this(...)而不是调用更默认的构造函数。您的代码应该不会导致您描述的 NPE,因此谜团仍在继续。