2012-04-12 8 views
1

私は(私はjarファイルを作成することができるように)JAppletの中のJPanelに画像を追加したいので、私は使用:。NullPointerExceptionがJAppletの()の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(...)'はあなたのクラスファイルに関して相対パスを要求していると思います。だからそれに応じて、イメージをどこに配置するかを指定する必要があります。どのように 'ツールキット'は 'ドライブD 'がどこにあるのか知るでしょう。さらに詳しいヘルプについては、このリンクをチェックしてください:[画像の追加方法](http://stackoverflow.com/questions/9864267/load-icon-image-exception/9866659#9866659)。 –

+0

ええ、問題は解決しました。私は写真をクラスファイルと同じパスに入れ、getResource( "/ hinhtu.jpg")); - 出来た!! –

+2

リソースが見つかったとしても、そのコードにはまだ問題があります。 1) 'paintComponent()'に2つのイメージを読み込もうとしました。 2) 'this'(' JPanel')**が** 'ImageObserver'であるときに描画の' ImageObserver'として 'null'を使います。 - それは 'CustomPanel'の上に任意のコンポーネントを追加することを意図しているのですか、それとも何か他のものを描画することを意図していますか?そうでない場合は、イメージをラベルに入れて親パネルのCENTERに追加するだけです。 –

答えて

2

getClass().getResource()
プロジェクトのクラスパスに対してのみ機能します。

ここで、ImageIO.read()は、入力ストリームとしてparamsに渡されたものを読み取ることができるため、画像ファイルをクラスパスに配置する必要があります。