2012-04-12 54 views
1

我想在圖像中JApplet的添加到JPanel的(這樣我就可以創建JAR文件),所以我用:NullPointerException異常JApplet的用的getClass()的getResource

Image x = Toolkit.getDefaultToolkit().getImage(
    getClass().getResource("D:/THANH_TAI LIEU/niet/hinhtu.jpg")); 

但顯示java.lang.NullPointerException發生。我敢肯定,圖片的路徑是正確的,因爲小應用程序運行正常,當我用:

Image image = ImageIO.read(new File("D:/THANH_TAI LIEU/niet/hinhtu.jpg")); 

例外:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException 
at sun.awt.SunToolkit.getImageFromHash(SunToolkit.java:830) 
at sun.awt.SunToolkit.getImage(SunToolkit.java:887) 
at applet$CustomPanel.paintComponent(applet.java:65) 
at javax.swing.JComponent.paint(JComponent.java:1029) 
at javax.swing.JComponent.paintChildren(JComponent.java:862) 
at javax.swing.JComponent.paint(JComponent.java:1038) 
at javax.swing.JComponent.paintChildren(JComponent.java:862) 
at javax.swing.JComponent.paint(JComponent.java:1038) 
at javax.swing.JComponent.paintChildren(JComponent.java:862) 
at javax.swing.JComponent.paint(JComponent.java:1038) 
at javax.swing.JLayeredPane.paint(JLayeredPane.java:567) 

代碼:

import java.awt.BorderLayout; 
    import java.awt.Color; 
    import java.awt.Graphics; 
    import java.awt.Image; 
    import java.awt.Toolkit; 
    import java.io.File; 
    import java.io.IOException; 

    import javax.imageio.ImageIO; 
    import javax.swing.BorderFactory; 
    import javax.swing.ImageIcon; 
    import javax.swing.JApplet; 
    import javax.swing.JButton; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 

    public class applet extends JApplet { 
    public void init() { 
    //Execute a job on the event-dispatching thread: 
    //creating this applet's GUI. 
    try { 
     javax.swing.SwingUtilities.invokeAndWait(new Runnable() { 
      public void run() { 
       createGUI(); 
      } 
     }); 
    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
} 

    private void createGUI() { 
    JPanel panel = new JPanel(new BorderLayout()); 
    JButton button = new JButton("CLICK ME"); 
    panel.add(button, BorderLayout.SOUTH); 
    panel.add(new CustomPanel(), BorderLayout.CENTER); 

    add(panel); 
    } 

public class CustomPanel extends JPanel{ 

    public void paintComponent(Graphics g) { 

     Image image = null; 
     try { 
      image = ImageIO.read(new File("D:/THANH_TAI LIEU/niet/hinhtu.jpg")); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Image x = Toolkit.getDefaultToolkit().getImage(getClass().getResource("D:/THANH_TAI LIEU/niet/hinhtu.jpg")); 
     g.drawImage(x, 0, 0, null); 

    } 



} 
} 

可能是什麼問題?

+1

我猜'getClass()。getResource(...)'需要相對於你的類文件的相對路徑。因此,取決於您需要指定的位置,圖像的位置。你的'Toolkit'怎麼知道'Drive D'的位置。檢查此鏈接進一步的幫助:[如何添加圖像](http://stackoverflow.com/questions/9864267/load-icon-image-exception/9866659#9866659)。 – 2012-04-12 05:25:31

+0

是的,問題解決了。我把這個圖片放到類文件的相同路徑中,並且getResource(「/ hinhtu.jpg」)); - 有效!! – 2012-04-12 05:33:57

+2

即使找到資源,該代碼仍然存在一些問題。 1)試圖在'paintComponent()'中加載2個圖像 - 不要在該方法中加載資源。 2)當'this'('JPanel')**是一個**'ImageObserver'時,使用'null'作爲圖像的'ImageObserver'。 - 它是否打算在「CustomPanel」之上添加任何組件,或者爲其繪製其他任何內容?如果沒有,只需將圖像放在標籤中並將其添加到父面板的CENTER中。 – 2012-04-12 08:01:28

回答

2

getClass().getResource()
僅適用於項目的類路徑。
您需要將圖像文件放在類路徑中以便查找
其中ImageIO.read()可以讀取在參數中傳遞的任何內容作爲輸入流。

相關問題