2012-05-09 5 views
2

私は自分のパネルショーイメージを背景にしようとしています。私はすでにNetBeansでこれを行うことができますが、私がjarをビルドして実行すると、イメージは表示されません。私は別にそれにアクセスしなければならないことを知っています。私は多くのチュートリアルを見てきましたが、それらのすべてがImageIconでそれを行う方法を示していますが、私はそれを必要としません、私はちょうどイメージが必要です。誰かがこれを行うために必要なコードを指摘できますか?ありがとう。.jarファイルから実行すると画像が表示されないのはなぜですか?

これは、バックグラウンドにJPanelのための私のコードです:

public class JPanelWB extends JPanel { // Creates JPanel with given image as background. 

    private Image backgroundImage; 

    public JPanelWB(String fileName){ 
     try { 
      backgroundImage = ImageIO.read(new File(fileName)); 
     } catch (IOException ex) { 
      new JDialog().add(new Label("Could not open image."+ex.getMessage())); 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     // Draw the background image. 
     g.drawImage(backgroundImage, 0, 0, getWidth(),getHeight(),this); 
    } 
} 
+5

イメージをリソースとしてではなくファイルとして取得しようとしている可能性があります。私たちが自信をもってこれに答えるためには、より多くの情報を提示する必要があります。 –

+0

コードで今投稿された投稿を編集しました –

答えて

1

うん、あなたはファイルとして画像を読み込むしようとしている - ファイルがJARファイル内に存在していないので、ということをしません。代わりにそれをリソースとして読んでください。そのような

何か:

public JPanelWB(String resourceName){ 
    try { 
     // backgroundImage = ImageIO.read(new File(resourceName)); 
     backgroundImage = ImageIO.read(getClass().getResource(resourceName)); 
    } catch (IOException ex) { 
     new JDialog().add(new Label("Could not open image."+ex.getMessage())); 
    } 
} 

しかし、リソースパスがファイルパスとは異なることに注意してください。リソースパスは、クラスファイルの場所からの相対パスです。

+0

どうすればいいですか? –

+0

上記のコードを参照してください。ただし、リソースパスはファイルパスとは異なります。リソースパスは、クラスファイルの場所からの相対パスです。 –

+0

@RohitMalish:うまくいけば、このスレッドはあなたを助けるかもしれない:[あなたのプロジェクト用の画像を読み込む](http://stackoverflow.com/questions/9864267/load-icon-image-exception/9866659#9866659) :-) –

0

新しい画像を読み込んで背景として読み込む場合は、私よりスマートな方が既にあなたの質問に答えています。

しかし、あなたの問題は私に似ている場合、これは助けmigh:

を既に表示する画像を持っている場合、ポイントは絶対パスからそれらを呼び出すことです。実行可能クラスのフォームJARは、コンピュータの物理ドライブではなく、仮想マシン内で作成されたドライブを読み込みます。

Cのような短い・パス・フォルダの

入れ画像:\ J \ projの\ IMG \

「Cのような絶対パスでそれらを呼び出す:\\ Jは\\のproj \ \ img \\ your_image.png "//(ダブルバックスラッシュを忘れないでください)

(パスの長さに気にしない場合は、プロジェクトパッケージ内のイメージフォルダにそれらを残し、そこから呼び出します。 )

NetBeansはそれらを絶対パスでJARにパックします。実行時に、JREはそのパスを持つJVMを作成し、JARからイメージを取り出して仮想パスに配置します。クラスは物理ドライブからのパスを読み込むのではなく、JVM内で新しく作成された仮想パスから読み込むため、クラスを見つけることができます。

この場合、ImageIconを避けることはちょっと乱雑です。

private JLabel blackBoard; 
    private JLabel noteToSelf; 
    //..... 
    blackBoard = new JLabel(); 
    noteToSelf = new JLabel(); 
    //..... 

    // putting JLabel "blackBoard" as background into JFrame 
    blackBoard.setIcon(new ImageIcon("c:\\Java\\images\\MarbleTable.png")); 
    getContentPane().add(blackBoard); 
    blackBoard.setBounds(1, 1, 400, 440); 
    blackBoard.setLayout(null); 

をしてから「黒板」の代わりに、あなたのJFrame、同様にコンポーネントを追加します。JLabelのは、あなたのJFrameの背景なるようにあなたが「黒板」を追加することができます

は、このような何かをnullにそのレイアウトを設定しましたこの。

// putting JLabel "noteToSelf" onto background 
    noteToSelf.setIcon(new ImageIcon("c:\\Java\\images\\Sticker_a1.png")); 
    // or: noteToSelf.setText("Remind me at 6:30am..."); 
    blackBoard.add(noteToSelf); 
    noteToSelf.setBounds(noteX, noteY, 64, 48); 

ここでJFrameはテーブルボードで、「blackBoard」はその上にテーブルシートです。

これが役に立ちます。

関連する問題