Java jar中带有外部图像的ImageIcon

Java jar中带有外部图像的ImageIcon,java,eclipse,embedded-resource,executable-jar,imageicon,Java,Eclipse,Embedded Resource,Executable Jar,Imageicon,我正在做我的大学项目,它在我的IDE上运行,但当我试图直接从jar运行它时,它根本不会加载任何图像。所以我在proyect中创建了一个resources文件夹,但显然,它不起作用,因为我不知道如何调用它们。我已经阅读了很多使用“getClass().getResource()”方法的文章,但是它给了我一个空指针异常。有人帮忙吗?我要留下我的密码: (顺便说一句,这是一款megaman游戏): } 这是我在Eclipse项目中如何使用文件夹的图像: 我已经试过使用这个: public GameO

我正在做我的大学项目,它在我的IDE上运行,但当我试图直接从jar运行它时,它根本不会加载任何图像。所以我在proyect中创建了一个resources文件夹,但显然,它不起作用,因为我不知道如何调用它们。我已经阅读了很多使用“getClass().getResource()”方法的文章,但是它给了我一个空指针异常。有人帮忙吗?我要留下我的密码: (顺便说一句,这是一款megaman游戏):

}

这是我在Eclipse项目中如何使用文件夹的图像:

我已经试过使用这个:

public GameObject(int x,int y, int velX,int velY,String archivo){
this.x = x;
this.y = y;
this.velX = velX;
this.velY = velY;
principal = new ArrayList<ImageIcon>();
ImageIcon imagen = new ImageIcon(getClass().getResource(archivo));
principal.add(imagen);
mono = new JLabel(principal.get(0));    
mono.setBounds(this.x,this.y,mono.getIcon().getIconWidth(),mono.getIcon().getIconHeight());
}
公共游戏对象(intx,inty,intvelx,intvely,String archivo){
这个.x=x;
这个。y=y;
this.velX=velX;
这是一个很好的例子;
主体=新的ArrayList();
ImageIcon imagen=新的ImageIcon(getClass().getResource(archivo));
委托人。添加(imagen);
mono=newjlabel(principal.get(0));
mono.setBounds(this.x,this.y,mono.getIcon().getIconWidth(),mono.getIcon().getIconHeight());
}

但是这给了我一个空指针异常,如果没有它,它就不是。任何帮助都是非常感谢的。提前谢谢

您需要以流的形式获取资源。这将为您提供一个
InputStream
,您可以使用它从jar加载图像

  • 使用
    getClass()
  • 使用
    getResourceAsStream()
    获取
    InputStream
    。请记住,您的
    src
    文件夹将在jar中消失。他指出,
  • 然后使用
    ImageIO.read()
    并传递
    InputStream
    以获取
    buffereImage
  • BufferedImage
    是一个
    图像
    ,因此您可以将其强制转换为
    Image
    类型的变量。那么,就这样做吧
  • ImageIcon
    具有一个构造函数,该构造函数具有一个接受
    图像的构造函数
    
    你完了

    很难猜测什么时候我们只有一个屏幕截图,但通过查看您的图标,我怀疑您的
    资源
    文件夹被排除在构建路径之外。在这种情况下,它不会复制到
    bin
    文件夹,因此
    getResource
    调用无法访问

    尝试右键单击
    Resources
    文件夹并选择“构建路径”→从弹出菜单中选择“包括”。图标应该从通用文件夹更改为类似于包的图标(尽管它看起来与包含类的包不同)。然后是一个
    GameObject.class.getResourceAsStream(“Resources/megamanpd.png”)应该在Eclipse中工作


    如果构建路径设置正确,那么生成jar应该会得到正确的默认设置,但是似乎已经手动添加了
    src/Resources/
    文件夹到
    bin
    内容中。因此,您可能必须手动修复设置。使用默认设置重新生成jar现在应该可以获得一个jar,其中
    getResource
    可以正常工作。

    查看您的jar文件。它是否包含src文件夹?不,它不是,因为src是您在开发环境中存储源代码的地方。图像的路径应该是
    /Resources/megamanpd.png
    ,因为这就是图像在jar中的位置。事实上,是的,我的jar包含一个src文件夹,我是用Winrar打开的,还有一个src文件夹。@HectorHammett在加载时并不重要。忘了
    src
    文件夹吧。那么你的jar结构就不好了。它不应该包含src文件夹。jar的内容应该与eclipse项目的bin文件夹的内容相同(或者与您决定命名eclipse项目的输出目录的内容相同)。@JBNizet我完全同意您的看法。JAR的内容应该是
    src
    文件夹中的任何内容,但JAR中没有
    src
    。出于某种原因,我的JAR中有一个src文件夹。我和温拉对峙了一下,就在那里。里面有我所有的照片。让我试试你给我的解决方案。我这样做了,它给了我这个错误:线程“main”java.lang.IllegalArgumentException中的异常:input==null@HectorHammett您要输入的路径是什么?
    getResourceAsStream
    ?我尝试了各种方法:“Resources/megamanpd.png”、“src/Resources/megamanpd.png”和“/Resources/megamanpd.png”。在所有情况下,您都有一个
    null
    ??
    public MegamanSprite(int x, int y) {
        super(x, y, 1, 1, "src/Resources/megamanpd.png");
    
    public GameObject(int x,int y, int velX,int velY,String archivo){
    this.x = x;
    this.y = y;
    this.velX = velX;
    this.velY = velY;
    principal = new ArrayList<ImageIcon>();
    ImageIcon imagen = new ImageIcon(getClass().getResource(archivo));
    principal.add(imagen);
    mono = new JLabel(principal.get(0));    
    mono.setBounds(this.x,this.y,mono.getIcon().getIconWidth(),mono.getIcon().getIconHeight());
    }