【问题标题】:Java Swing - java.lang.NullPointerExceptionJava Swing - java.lang.NullPointerException
【发布时间】:2013-04-10 20:21:55
【问题描述】:

当我覆盖我的 GamePanel 类的绘制方法时,当我尝试打开 MazeGUI 设计选项卡时,我收到此错误:

Internal Error
WindowBuilder encountered unexpected internal error. 

This could be caused by a WindowBuilder bug or by a misconfiguration issue, conflict,  partial update, etc.

Stack trace:
java.lang.NullPointerException
at maze.gui.GamePanel.paint(GamePanel.java:25)  
at javax.swing.JComponent.print(Unknown Source)  
at javax.swing.JComponent.paintChildren(Unknown Source)  
at javax.swing.JComponent.printChildren(Unknown Source)  
at javax.swing.JComponent.paint(Unknown Source)  
at javax.swing.JComponent.print(Unknown Source)  
at javax.swing.JComponent.paintChildren(Unknown Source)  
at javax.swing.JComponent.printChildren(Unknown Source)  
at javax.swing.JComponent.paint(Unknown Source)  

如果我在 GamePanel.java 的绘制覆盖函数中删除这一行

g.drawImage(maze.wall, 400, 400, null);

MazeGUI 的设计选项卡已经可以使用。很奇怪……

无论如何,如果我运行 java 应用程序,它会显示图像而没有任何错误。

在这里,我保留了两个类的 java 文件: GamePanel.java:

package maze.gui;

import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class GamePanel extends JPanel {
    private int comprimento_sprites;
    private MazeGUI maze;

/**
 * Create the panel.
 */
public GamePanel(MazeGUI m) {
    comprimento_sprites = 40;
    maze = m;
    setFocusable(true);
}

@Override
public void paint(Graphics g) {
    super.paint(g);

g.drawImage(maze.wall, 400, 400, null);
}

}

MazeGUI.java:

package maze.gui;

import java.awt.EventQueue;
import java.awt.Image;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import maze.logic.Jogo;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class MazeGUI {

private JFrame frmMazeGame;
//IMAGES
    public BufferedImage wall;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MazeGUI window = new MazeGUI();
                window.frmMazeGame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public MazeGUI() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {

    //faz load das imagens do jogo
    loadImages();

    frmMazeGame = new JFrame();
    frmMazeGame.setTitle("Maze Game");
    frmMazeGame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    GamePanel tabuleiro = new GamePanel(this);
    frmMazeGame.getContentPane().add(tabuleiro);
}

private void loadImages(){

    try {
        wall = ImageIO.read(new File("images/bloco.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}

啊,让我补充一下: - 我认为所有这些问题都与 MazeGUI 的 loadImages 功能有关,但我认为我做得很好。已经浪费了很多时间试图解决这个问题。
- 请记住:运行应用程序时没有错误(它甚至在应用程序中显示图像)但是当我尝试打开“设计”选项卡时出现上述错误:/

【问题讨论】:

  • 您能否清理代码以仅显示重要部分,以及堆栈跟踪的第一部分?它变得非常混乱和复杂。
  • 完成! :) 我认为您现在可以更好地理解代码...
  • 设计选项卡的执行上下文和程序运行时的执行上下文不同。这意味着设计视图找不到图像。还。不要覆盖paint,而是使用paintComponent,并确保您也在调用super.paintComponent。不要将核心逻辑基于框架内,而是使用面板。这使您的程序更加灵活
  • MadProgrammer:尝试使用paintComponent,但问题仍然存在:s

标签: java swing nullpointerexception imagecreatefrompng


【解决方案1】:

由于这一行,您在加载“设计”选项卡时收到错误:

g.drawImage(maze.wall, 400, 400, null);

我对 WindowBuilder 没有太多经验,所以我不能告诉你它是如何工作的,但在设计模式下,GamePanel 中的 MazeGUI 对象似乎是 null。这不是您的图像加载的问题,只是因为 WindowBuilder 的工作原理。

要加载“设计”选项卡,您只需在其中检查 null

if (maze != null && maze.wall != null) {
    g.drawImage(maze.wall, 400, 400, null);
}

至于让图像实际显示在“设计”选项卡中,恐怕我帮不了你。

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多