3

私はEclipseでJavaプロジェクトを開発しています。プログラムを配布するために、Eclipse のエクスポート機能を使用して実行可能な .jar ファイルを作成しました。

私のプログラムでは、「tableImages」というフォルダーに保存されているいくつかの画像をロードします。ClassLoader を介して画像を読み込みます (以下のコード スニペットを参照してください)。問題は次のとおりです。.jar ファイルからプログラムを実行すると、上記のフォルダーにある .png ファイルの 1 つをロードするときに NullPointerException がスローされます。面白いことに、まったく同じフォルダー内の .png ファイルの一部が正しく読み込まれているため、NullPointerException は発生しません。

jar tf コマンドを使用して .jar の内容を確認しました。ロードできないと思われるイメージが jar にパックされていました。では、この NullPointerException の原因は何ですか?どうすれば解決できますか?

これは、swing-frame に画像を描画するクラスです。

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.net.*;

public class LoadBackgroundImage extends Component {

    private static final long serialVersionUID = 1L;

    BufferedImage img;

    public void paint(Graphics g){
        g.drawImage(img, 0, 0, null);
    }

    public LoadBackgroundImage(String image){
        URL url = ClassLoader.getSystemResource(image);
        try{
            img = ImageIO.read(url);
            this.setSize(img.getWidth(), img.getHeight());
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public Dimension getPreferredSize(){
        if(img == null){
            return new Dimension(100, 100);
        }else{
            return new Dimension(img.getWidth(null), img.getHeight(null));
        }
    }

    public BufferedImage getImage(){
          return img;
         }

}

ご助力ありがとうございます!

4

3 に答える 3

3
URL url = ClassLoader.getSystemResource(image);

この URL は、ファイル システム内の絶対パスに変換されます。これは、jar 内のファイルの無効なパスになります。たとえば、bar.jar の下に foo.png というファイルがある場合、URL は無効な /path_to_current_dir/bar.jar/!foo.png になります。代わりに、ファイルをストリームとして読み取ることができます。

InputStream is = getClass().getClassLoader().getResourceAsStream(image);
ImageIO.read(is);
于 2012-05-12T22:05:36.217 に答える
2

URL を使用できます。私は自分で試してみましたが、完全に機能し、jar 内から png ファイルを取得できます。

使用したコードは次のとおりです。

public static ImageIcon getIcon(String path)
    {
        String imageFile = "";

        if(path.equals(""))
            imageFile = "/Images/Icon.png";
        else
            imageFile = path;

        URL source = Messages.class.getResource(imageFile);
        if(source != null)
        {
            ImageIcon imageIcon = new ImageIcon(source);
            return imageIcon;
        }
        return null;
    }

次に、それをJLabelに直接追加し、魅力的に機能させました。また、jarファイルを移動し、jarの外部で画像ファイルの名前を変更したので、確信しています。

于 2012-05-12T22:19:47.530 に答える
2

ファイルが実際に .jar パッケージにあると仮定すると、.jar ファイルのエントリが大文字と小文字を区別して読み込まれるため、.jar ファイルと同じでfoo.pngないFoo.png可能性が最も高いと考えられます。通常のファイルからロードする場合、動作はファイル システムに依存するため、Windows と Mac ではfoo.png同じFoo.pngファイル (!) を示します。

于 2012-05-12T22:01:05.107 に答える