Java Swing - исключение java.lang.NullPointerException

Когда я переопределяю метод рисования моего класса 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();
    }

}

}

Ах, позвольте мне добавить это: - Я думаю, что вся эта проблема связана с функцией loadImages в MazeGUI, но я думаю, что я все делаю хорошо. Уже потерял столько часов, пытаясь это исправить.
- Имейте в виду: нет ошибки при запуске приложения (оно даже показывает изображение в приложении), но я получаю ошибку выше, когда пытаюсь открыть вкладку "Дизайн":/

1 ответ

Решение

Вы получаете сообщение об ошибке при загрузке вкладки "Дизайн" из-за этой строки:

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

У меня нет большого опыта работы с WindowBuilder, поэтому я не могу сказать вам, как он работает, но кажется, что ваш MazeGUI объект в GamePanel является null когда в режиме дизайна. Это не проблема с загрузкой вашего изображения, это просто из-за того, что WindowBuilder работает.

Чтобы загрузить вкладку "Дизайн", вы можете просто бросить проверку null там:

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

Что касается того, чтобы заставить изображение отображаться на вкладке "Дизайн", я боюсь, что не могу вам помочь.

Другие вопросы по тегам