2013-04-10 2 views
-2

Когда я переопределить метод рисования моего класса GamePanel, тогда, когда я пытаюсь открыть MazeGUI Tab Design, я получаю эту ошибку:Java Swing - java.lang.NullPointerException

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(); 
    } 

} 

}

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

+0

Не могли бы вы очистить код, чтобы показывать только важные части и только первые части stacktrace? Его становится очень грязным и сложным. – Haedrian

+0

Готово! :) Я думаю, что теперь вы можете лучше понять код ... –

+1

Контекст выполнения для вкладки дизайна и контекста выполнения при запуске программы отличается. Это означает, что проектный вид не может найти изображение. Также. Не переопределяйте краску, используйте paintComponent и убедитесь, что вы вызываете super.paintComponent. Вместо того, чтобы основывать основную логику внутри фрейма, вместо этого используйте панель. Это делает вашу программу более гибкой. – MadProgrammer

ответ

0

При получении ошибки при загрузке вкладка Дизайн из этой линии:

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

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

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

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

Насколько получать изображение на самом деле показать на вкладке Design, я боюсь, что я могу Не помогите.

+0

Спасибо, вы решили мою проблему :) –

Смежные вопросы