面板中的getGraphics返回null

时间:2014-05-12 20:52:03

标签: java swing graphics nullpointerexception draw

所以我有一个扩展JApplet的类Board,在它的构造函数中,我创建了一个JPanel,后来我开始绘制框,但是当我尝试使用getGraphics时它返回null:/

JPanel panel;
public Board(int x, int y, int wolfNumber, int hareNumber){
    this.x=x;
    this.y=y;

    wolvesCoords = new int[wolfNumber][2];
    haresCoords = new int[hareNumber][2];

    panel = new JPanel();
    panel.setVisible(true);

    add(panel);
}


public synchronized void write(int xx, int yy, Color c){
    int width=panel.getWidth()/x;
    int height=panel.getHeight()/y;

    Graphics g = panel.getGraphics();
    System.out.println(g);

    g.setColor(c);

    g.drawRect(xx*width, yy*height, width, height);
    g.fillRect(xx*width, yy*height, width, height);


}

public void paint(Graphics g)
{
        super.paint(g);
}

它在g.setColor(c)行给出nullpointerexception,因为g为null。

2 个答案:

答案 0 :(得分:3)

您的常见问题和问题是您不应该使用通过在组件上调用getGraphics()获得的Graphics对象的另一个原因。你不应该这样做的另一个原因是,如果你成功获得一个非null的Graphics对象(只有 组件已经渲染后),它将不会持久存在,并且你的图像如果发生任何重绘,则可以变为空。

而是执行教程建议您做的事情:使用JPanel的paintComponent方法中提供给您的Graphics对象进行绘制。如果要绘制固定背景,则在BufferedImage中执行此操作,然后在paintComponent方法中绘制BufferedImage。


修改
你问:

  

为什么我会在paint方法中调用绘图代码?我只需要在调用方法write时绘制,而不是在应用程序启动时绘制。

因为这就是Swing图形的完成方式,因为按照自己的方式进行操作会遇到很多问题(您已经遇到过这种情况)。再一次,不要猜测这些东西 - 阅读教程,它们都为你解释得很好。


修改
您在评论中说明:

  

实际上当我尝试添加覆盖时会出现此错误 - 方法不会覆盖或实现超类型的方法。可能是我正在扩展JApplet吗?

是的,完全如此。

  

我必须

是的,您必须有一个扩展JApplet的类才能生成JApplet,但您不必并且实际上不应该直接在其中绘制。而是创建一个扩展JPanel的单独类,并在该类的paintComponent方法中创建图形。然后在applet中显示JPanel。

答案 1 :(得分:3)

您使用的Graphics对象错误。而不是在您调用它的任何地方调用write,而是覆盖paintComponent。你可以这样做:

private int xx;
private int yy;
private Color c;

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(c != null) {
        int width=panel.getWidth()/x;
        int height=panel.getHeight()/y;

        g.setColor(c);

        g.drawRect(xx*width, yy*height, width, height);
        g.fillRect(xx*width, yy*height, width, height);
    }
}

public void write(int xx, int yy, Color c) {
    this.xx = xx;
    this.yy = yy;
    this.c = c;
    repaint();
}