0

最近我开始编写一些 Java 2D 代码。

我做的:

    public void paintComponent(Graphics comp) {
         Graphics2D comp2D = (Graphics2D) comp;
         Font fontx = new Font("Verdana", Font.BOLD, 5);
         comp2D.setFont(fontx);
         comp2D.drawString("Hello World!", 5, 50);
}  

我确实导入了 JFrame 和 java.awt.*,但还是有问题。

当我运行它时,我得到了这个:

    Exception in thread "main" java.lang.NullPointerException
    at game.Game.paintComponent(Game.java:41) - comp2D.setFont(fontx); - Sets Font
    at game.Game.next(Game.java:36) - paintComponent(null); - calls the paintComponent public void from the next() public void
    at game.Game.main(Game.java:26) - next.next(); - calls a public void called "next" using an object called "next" (this public void throws InterruptedException)
Java Result: 1

我该如何解决?

4

1 回答 1

4

你说:

Exception in thread "main" java.lang.NullPointerException
at game.Game.paintComponent(Game.java:41) -  
    comp2D.setFont(fontx); - Sets Font

这意味着 comp2D 为 null 并且您正在尝试对 null 变量调用方法。

at game.Game.next(Game.java:36) - paintComponent(null); 
     - calls the paintComponent public void from the next() public void

这意味着您直接调用paintComponent 并传入null!

所以你直接调用paintComponent并传入null!Graphics 对象为 null 并且如果您尝试对其调用方法将引发 NPE,这不足为奇。

解决方案:

  • 您几乎从不直接调用paintComponent。
  • 而是在调用 repaint() 时让 JVM 调用它。JVM 将传入一个有效的 Graphics 对象。
  • 最重要的——用 Swing 教程阅读绘画。您无法猜测这些东西并期望它起作用。
  • 确保您的 paintComponent 方法保存在 JPanel 或其他 JComponent 派生组件中。
  • @Override通过使用paintComponent 的注释确保您的覆盖有效。
  • 不要忽略super.paintComponent(...)在覆盖中调用该方法。
  • 例如,让您的其他方法更改一个类字段,比如说让它更改一个名为 text 的字符串字段,然后调用repaint(),然后让您的paintComponent(...)方法使用文本字段来在 JPanel 中打印文本。这只是一个例子。您可以更改任何绘图组件的字段,然后在paintComponent(...).
于 2013-10-06T18:07:35.197 回答