2012-04-12 11 views
1

Ich möchte ein Bild zu JPanel in JApplet hinzuzufügen (so, dass ich die JAR-Datei erstellen kann), so dass ich verwendet:Nullpointer JApplet mit getClass() getResource

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

aber die java.lang.NullPointerException aufgetreten. Ich bin sicher, dass das Bild Pfad korrekt ist, da das Applet gut laufen, wenn ich verwende:

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

Die Ausnahmen:

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) 

Der Code:

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); 

    } 



} 
} 

Was das sein könnte Problem?

+1

Ich denke 'getClass(). GetResource (...)' erfordert relativen Pfad in Bezug auf Ihre Klassendatei. Abhängig davon müssen Sie angeben, wo sich das Bild befindet. Wie wird dein 'Toolkit' wissen, wo' Drive D' ist? Weitere Informationen finden Sie unter folgendem Link: [Hinzufügen von Bildern] (http://stackoverflow.com/questions/9864267/load-icon-image-exception/9866659#9866659). –

+0

Ja, das Problem ist gelöst. Ich lege das Bild in den gleichen Pfad mit der Klassendatei und getResource ("/ hinhtu.jpg")); - es funktionierte!! –

+2

Dieser Code hat immer noch einige Probleme, selbst wenn die Ressource gefunden wird. 1) Versuche 2 Bilder in 'paintComponent()' zu laden - lade nie Ressourcen in dieser Methode. 2) Verwenden von "null" als "ImageObserver" für die Zeichnung, wenn "this" (das "JPanel") ** ein "ImageObserver" ist. - Ist es beabsichtigt, irgendwelche Komponenten über "CustomPanel" hinzuzufügen oder etwas anderes darauf zu zeichnen? Ist dies nicht der Fall, legen Sie das Bild einfach in ein Etikett und fügen Sie es dem CENTER des übergeordneten Bedienfelds hinzu. –

Antwort

2

getClass().getResource()
Funktioniert nur für den Klassenpfad des Projekts.
Sie müssen die Bilddatei auf den Klassenpfad setzen, um
zu finden, wobei ImageIO.read() lesen kann, was in den Parametern als Eingabestrom übergeben wird.