2013-07-27 2 views
1

프로그래밍 할 작은 게임에 JFrame에 표시 할 배경 이미지를 얻으려고합니다. 이미지는 .JPG이고 나는 이러한 오류가 계속 :JPEG 이미지를 JFrame에 표시 할 수 없습니다.

Exception in thread "main" java.lang.NullPointerException 
    at javax.swing.ImageIcon.<init>(ImageIcon.java:205) 
    at web.game.Base.<init>(Base.java:45) 
    at web.game.Base.main(Base.java:61) 

을 그리고 내 코드는 다음과 같습니다

Image myimage; 

public Base() { 
    ImageIcon ii = new ImageIcon(this.getClass().getResource("myimage.jpg")); 
    myimage = ii.getImage(); 
} 

public void paint(Graphics g) { 

    Graphics2D g2d = (Graphics2D) g; 
    g2d.drawImage(myimage, 10, 10, null); 
+2

자바 리소스를 찾을 수 없다는 것, 그리고'this.getClass().의 getResource ("myimage을위한 널을 반환 .. 이런 식으로 뭔가를 시도하고 당신이 무엇을 얻을 참조하십시오. jpg ")'. IDE에서 리소스를 복사합니까? 확실한 경로가 맞습니까? –

+0

분명한 것은 이미지에 대한 참조가 'null'입니다. 이것은'myimage.jpg'가 당신이 그것을 읽으려고하는 클래스와 같은 위치에 있지 않다는 것을 암시합니다. 이미지는 어디에 있습니까? – MadProgrammer

+0

좋아, 그래서 netbeans를 사용하고 myimage.jpg 프로젝트 폴더의 루트에 존재합니다. 나는 myimage.jpg와 같은 경로로 같은 위치에서 재생할 오디오 파일을 가지고 있기 때문에 그 위치가 분명하다고 확신합니다. – TonyC

답변

3

하면 문제가 발생할 수 있습니다 많은 이유가 있습니다. 가장 눈에 띄는 이미지가

private BufferedImage myImage; 

public Board() { 
    try { 
     myimage = ImageIO.read(this.getClass().getResource("/myimage")); 
    } catch (IOException exp) { 
     exp.printStackTrace(); 
    } 
} 

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    if (myImage != null) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(myimage, 10, 10, this); 
     System.out.println("Background Image"); 
    } 
} 

당신은 Performing Custom Painting 일부 사용 Reading/Loading an Image을 찾을 수 있습니다 존재하지 않는 (또는 당신이하지 생각하는 곳 이상 존재하지 않음), 시작합니다.

getResource을 사용할 때 두 가지 (기본) 선택 사항이 있습니다. 상대 또는 절대.

상대 경로를 사용하면 클래스 로더가 클래스의 컨텍스트를 기반으로 검색을 시작합니다. 따라서 이미지가 프로젝트의 루트 폴더에 있지만 클래스가 패키지의 하위 폴더에있는 경우 클래스 로더가 클래스가 상주하는 위치에서 검색을 시작하기 때문에 상대 경로는 작동하지 않습니다.

절대 경로를 사용하면 클래스 경로의 루트에서 검색 할 수 있습니다. 특히이 경우에 도움이 될 것입니다.

System.out.println(TestReference.class.getResource("myimage.jpg")); 
System.out.println(TestReference.class.getResource("/myimage.jpg")); 
+0

@AndrewThompson 미안하지만, 내 나쁜, 복사 및 iPad에 OP 코드를 붙여, 그래서 정말 관심을 지불하지 않았다 – MadProgrammer

+0

고마워요 @MadProgrammer는 소스와 같은 폴더에있는 이미지를 원하는 속임수 않았다. 내가 간단한 물건을 망쳐 놓은 것 같아. – TonyC

+0

* ".. .. iPad의 OP 코드"* 아. 한때 휴대 전화에서 SO와 상호 작용을 시도했지만, 나는 관련시킬 수 있습니다. –