java - 如何在 java.applet.Applet 中获取 java.awt.Graphics 的实例?

标签 java applet awt java-2d

我目前正在为我的计算机科学课编写贪吃蛇游戏。然而,我遇到了很多困难(因为我是我所在街区中唯一一个单独工作的人),我不得不重新开始。

现在我只是想从我制作的第二个类(段)中创建一个对象数组(名为 Snake)。

我在第 26 行收到 NullPointerException:g.fillRect(xValue, yValue, size, size); 我应该在哪里获取 Graphics 实例来调用此方法?

import java.awt.*;
import java.applet.*;

public class Segment extends Applet
{
   private Graphics g;

   private int xValue;
   private int yValue;
   private int size;

   public Segment () {}

  public Segment(int x, int y)
  {
  xValue = x;
  yValue = y;

  size = 10;

  drawSegment(g);
   }

   public void drawSegment(Graphics g)
   {
      g.fillRect(xValue, yValue, size, size);
   }

  }

import java.awt.*;
import java.applet.*;

public class SnakeGame extends Applet
{
   private Segment[] snake;
   private Graphics g;

   private int length;
   private int sxValue;
   private int syValue;

   public SnakeGame()
   {
      length = 6;
      snake = new Segment[length];
      sxValue = 100;
      syValue = 100;

      for (int c = 0; c < snake.length; c++)
      {
         snake[c] = new Segment(sxValue, syValue);
         sxValue = sxValue + 10;     
      }

      drawSnake(g);

    }

   public void drawSnake(Graphics g)
   {
      for(int counter = 0; counter < length; counter++)
      {
          snake[counter].drawSegment(g);

      }  
    }


}

但是,我不断收到诸如此类的错误

java.lang.NullPointerException
at Segment.drawSegment(Segment.java:26)
at Segment.<init>(Segment.java:21)
at SnakeGame.<init>(SnakeGame.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at java.lang.Class.newInstance(Class.java:433)
at sun.applet.AppletPanel.createApplet(AppletPanel.java:799)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:728)
at sun.applet.AppletPanel.run(AppletPanel.java:378)
at java.lang.Thread.run(Thread.java:745)

最佳答案

您声明Graphics g;并且不实例化它。因此,您将 null 值传递给 drawSegment(Graphics g) 并尝试调用 g.fillRect(xValue, yValue, size, size);在那个 null 对象上。

java.awt.Graphics您正在使用的类只是一个抽象类。该对象需要通过某种实现来实例化 - 无论是由您还是框架。

由于您使用的是 Applet ,它继承了 Component,尝试 Component.getGraphics()获取图形对象。

private Graphics g = getGraphics();

然后,您在构造函数中调用绘图方法。这不是一个好的做法。实例化一个对象(这里是一个小程序)和绘制它是不一样的。

此外,这里的每个类都有自己的 Graphics 变量。似乎应该将单个实例用于所有绘制,并传递给每个可绘制对象。

关于java - 如何在 java.applet.Applet 中获取 java.awt.Graphics 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687327/

相关文章:

Java小程序: Java. exe进程大约1分钟后退出,下一代java插件

java - 系统外观和感觉是否会改变元素大小?

java - 浏览器中出现 NullpointerException,但 AppletViewer 中没有

java - 对我的 GUI 编程与 Java 中的递归集成的一点帮助

java - 从输入流 Java 读取多个 XML 文件

java - Spock 编译器插件无法运行,因为

java - HashMap 潜在的资源泄漏(未分配的 Closeable)

java - 以 'yyyy-MM-dd' 格式计算当前年份在 Java 中设置了不正确的值

Java 小程序不会在 Safari 中执行

java - 类(class)计划 - java JApplet