【问题标题】:How to get an instance of java.awt.Graphics in a java.applet.Applet?如何在 java.applet.Applet 中获取 java.awt.Graphics 的实例?
【发布时间】:2015-08-21 15:09:36
【问题描述】:

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

现在我只是想从我创建的第二个类(Segment)中创建一个对象数组(名为 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)

【问题讨论】:

  • 请在您的Segment.java 文件中标识第26 行。
  • @PM77-1 这个参考确实有帮助,但不能解决问题。识别出null对象,但不清楚如何获取实例。
  • @NickVolynkin :我曾经有过这样的concern。显然,整个社区不想为每个特定案例提供答案。
  • @PM77-1 在这种情况下,明确地问“为什么a 有空值?”可能会很好,明确指向产生异常的字符串和变量。 OP 没有在这个问题中完成这项工作,因此您的标志是合适的。

标签: java applet awt java-2d


【解决方案1】:

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

您使用的java.awt.Graphics 类只是一个抽象类。该对象需要通过一些实现来实例化 - 由您或框架。

由于您使用的是继承组件的Applet,因此请尝试使用Component.getGraphics() 获取图形对象。

private Graphics g = getGraphics();

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

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

【讨论】:

  • 我一直声明Graphics g;在我过去的代码中,因为过去对我来说它从来没有工作过......但是我应该将什么传递给 drawSegment,这就是我感到非常困惑的地方。
  • @CiaraLarence 在过去的代码中是否有效?您是否以某种方式实例化了该对象?
  • 它在过去的代码中工作,因为在不同的蛇类(重新启动,所以它现在是旧的)我声明了 Graphics g,然后第一次使用它是 g.setColor(color ) 但我从未实际实例化过。段类现在将无错误地运行,但小程序中没有显示任何内容。当我运行 SnakeGame 类时,我得到了所有错误。
  • @CiaraLarence 好吧,在 null 对象上调用任何方法都无法在没有异常的情况下运行。试试上次编辑的代码。
  • 如何使它不是空对象?我的旧课程的编码不起作用,因为我正在尝试一种完全不同的方法来制作游戏。这就是为什么我被卡住了。我的老师让我重新开始,并给了我绘制蛇阵列的任务。
【解决方案2】:

从自定义绘制组件的paint(Graphics) 或paintComponent(Graphics) 方法中获取Graphics 对象。那个时间(当 JVM 要求这样做时)是应该绘制 AWT/Swing GUI 的时间。有关更多详细信息和工作源,请参阅Performing Custom Painting。

一般提示/问题。

  1. 为什么要编写小程序?如果是老师指定的,请参考Why CS teachers should stop teaching Java applets。
  2. 为什么要使用 AWT?请参阅this answer,了解放弃使用组件来支持 Swing 的 AWT 的许多充分理由。
  3. 通常认为在添加到顶级容器而不是容器本身的Panel、Canvas 或JPanel 中进行自定义渲染会更好。这更容易适应,因为我们可以在小程序、框架、对话框或另一个面板的布局约束中显示面板。还有其他优势。
  4. 上面有两个小程序,但只有SnakeGame应该是一个小程序。 Segment 类应该只知道如何在被要求这样做时将自己绘制到 Graphics 对象。然后SnakeGame 可以存储Segment 对象的列表,并(在请求时)依次绘制每个对象。
  5. 不要为小程序声明构造函数,因为无法确保在事件调度线程上调用它。在init() 方法中“仅第一次”执行所有操作。但说真的,请避免使用小程序,因为它们是一种过时的技术,只会让您头疼。

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2019-07-08
    • 2018-12-23
    • 2019-07-18
    相关资源
    最近更新 更多