2013-07-27 38 views
1

我想要獲取背景圖像以便在編程的小遊戲上顯示JFrame。該圖像是jpg和我不斷收到這些錯誤:無法獲得JFrame中顯示的JPEG圖像

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

看來,Java的找不到自己的資源,並返回了'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上的OPs代碼,所以沒有真正關注 – MadProgrammer

+0

謝謝@MadProgrammer做了它想要在同一個文件夾中的圖像作爲源的伎倆。看起來像我一直搞亂簡單的東西。 – TonyC

+0

*「iPad上的OPs代碼」*啊。曾經嘗試過與移動電話上的SO交互,我可以說。 –