후, 나는이 오류 페인트 오버라이드 기능에서 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에서 작동하지만, 나는 괜찮다고 생각합니다. 벌써 많은 시간을 잃어서 이것을 고치려고 노력했습니다.
- 앱을 실행하면 앱을 실행해도 오류가 발생하지 않지만 디자인 탭을 열려고하면 위의 오류가 발생합니다./
중요한 부분과 스택 트레이스의 첫 부분 만 표시하도록 코드를 정리할 수 있습니까? 점점 지저분 해지고 복잡해집니다. – Haedrian
완료! :) 당신이 지금 코드를 더 잘 이해할 수 있다고 생각합니다. ... –
프로그램을 실행할 때 디자인 탭과 실행 컨텍스트에 대한 실행 컨텍스트가 다릅니다. 즉, 디자인보기에서 이미지를 찾을 수 없습니다. 또한. 페인트를 오버라이드하지 말고, 대신 paintComponent를 사용하고 super.paintComponent도 호출하는지 확인하십시오. 대신 프레임 내에서 코어 로직을 기반으로하는 대신 패널을 사용하십시오. 이것은 당신의 프로그램을 더 유연하게 만든다. – MadProgrammer