2013-04-10 2 views
-2

후, 나는이 오류 페인트 오버라이드 기능에서 GamePanel.java의 라인자바 스윙 내 GamePanel에 클래스의 페인트 메소드를 오버라이드 (override) 할 때 나는 MazeGUI 디자인 탭을 열 때 java.lang.NullPointerException이

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

MazeGUI의 디자인 탭이 이미 작동합니다. 매우 이상한 ...

어쨌든, 내가 자바 응용 프로그램을 실행하면 오류없이 이미지를 표시합니다. 여기

나는 두 클래스 자바 파일을 떠나 : 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(); 
    } 

} 

}

아, 내가 추가 할을 this : -이 모든 문제는 l과 관련이 있다고 생각합니다. oadImages는 MazeGUI에서 작동하지만, 나는 괜찮다고 생각합니다. 벌써 많은 시간을 잃어서 이것을 고치려고 노력했습니다.
- 앱을 실행하면 앱을 실행해도 오류가 발생하지 않지만 디자인 탭을 열려고하면 위의 오류가 발생합니다./

+0

중요한 부분과 스택 트레이스의 첫 부분 만 표시하도록 코드를 정리할 수 있습니까? 점점 지저분 해지고 복잡해집니다. – Haedrian

+0

완료! :) 당신이 지금 코드를 더 잘 이해할 수 있다고 생각합니다. ... –

+1

프로그램을 실행할 때 디자인 탭과 실행 컨텍스트에 대한 실행 컨텍스트가 다릅니다. 즉, 디자인보기에서 이미지를 찾을 수 없습니다. 또한. 페인트를 오버라이드하지 말고, 대신 paintComponent를 사용하고 super.paintComponent도 호출하는지 확인하십시오. 대신 프레임 내에서 코어 로직을 기반으로하는 대신 패널을 사용하십시오. 이것은 당신의 프로그램을 더 유연하게 만든다. – MadProgrammer

답변

0

로드 할 때 오류가 발생합니다. 때문에이 라인의 디자인 탭은 다음 GamePanelMazeGUI 개체가 null 인 것처럼

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

나는 WindowBuilder에 많은 경험이없는, 그래서 그것을 정확히 어떻게 작동하는지 당신에게 말할 수 있지만, 그것은 보인다 디자인 모드 일 때. 그것은 당신의 이미지 로딩에 문제가 아니지만, 단순히 WindowBuilder가 작동하기 때문입니다.

로드 디자인 탭을 얻으려면, 당신은 단순히 거기에 null에 대한 검사를 던질 수 :

는 지금까지 실제로 디자인 탭에 표시 할 이미지를 얻고, 나는 두려워

if (maze != null && maze.wall != null) { 
    g.drawImage(maze.wall, 400, 400, null); 
} 
내가 할 수있는 너를 도와 주지마.

+0

고마워, 너는 내 문제를 해결했다 :) –