【问题标题】:Graphics NullPointerException when overriding Canvas paint method inline内联覆盖画布绘制方法时出现图形 NullPointerException
【发布时间】: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,因此谜团仍在继续。

标签: java canvas awt


【解决方案1】:

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

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

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

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

这是因为构造函数 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);
    }

} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多