如何在没有绝对路径的java项目中使用映像

如何在没有绝对路径的java项目中使用映像,java,image,netbeans,jar,Java,Image,Netbeans,Jar,我一直在做一个小项目来练习编程。基本上已经完成了,但在我能正确使用图像之前我不会感到满意,如果能提供一些帮助,我将不胜感激 因此,目前我正在使用ImageIcon类中的getImage方法,如下所示: Image body = new ImageIcon("C:/Users/Centollo/Documents/NetBeansProjects/Chess/build/classes/chess/img/WhiteBishop.png").getImage(); 我一直在试图弄清楚如何在不使用

我一直在做一个小项目来练习编程。基本上已经完成了,但在我能正确使用图像之前我不会感到满意,如果能提供一些帮助,我将不胜感激

因此,目前我正在使用ImageIcon类中的getImage方法,如下所示:

Image body = new ImageIcon("C:/Users/Centollo/Documents/NetBeansProjects/Chess/build/classes/chess/img/WhiteBishop.png").getImage();
我一直在试图弄清楚如何在不使用绝对路径的情况下做同样的事情,但我不知道如何使图像成为jar的一部分,以便在任何其他机器上都能正常工作

我所需要知道的就是把图像放在哪里,以及访问它们的代码是什么样子的。 请试着解释一下,就像我很笨一样。我读过类似问题的答案,但我不能理解它们的头绪


我在NetBeans中使用的是一个包含所有.java的“chess”包和一个包含所有.png的“chess.img”包。

一个非常快速的谷歌搜索会产生以下结果:

URL resource = getClass().getClassLoader().getResource( "img/WhiteBishop.png" );
Image body = new ImageIcon( resource );

有几种方法可以做到这一点,但我建议如下:

确保
chess.img
文件夹位于应用程序的类路径中。然后尝试引用路径,如
chess.img/image
(是的,可以在windows中使用正斜杠)

如果不起作用,请使用:

ChessClass.class.getClassLoader().loadResourceAsStream("/chess.img/image");

请注意文件引用开头的正斜杠。这指向类路径的根。这有点令人困惑,因为有unix/linux经验的人可能会认为它指的是文件系统的根。由于我10年前就知道的原因,这个答案比另一个答案更有效。这是一个丑陋的Java,从来没有被彻底清理过。

如果您的类从JFrame扩展,您可以这样做:

Image image = new ImageIcon(this.getClass().getResource("/images/MyImage.jpg")).getImage();
如果您的类扩展了Applet,您可以这样做:

private URL base = null;
private Image myImage = null;

try
{
    base = getDocumentBase();
} catch (Exception e)
{
    e.printStackTrace();
}

myImage = getImage(base, "images/MyImage.jpg");

注意:路径必须是“chess/img/WhiteBishop.png”,因为这是完整的包。它可以工作,但出于某种原因,img文件夹必须位于项目中的src文件夹(带有.java文件)和build/classes文件夹(带有.class)内。否则,我会在代码的第二行得到一个NullPointerException。(我添加了getImage()方法)。它应该是这样工作的吗?嗯。图像的主要位置应该是您希望它位于源代码文件夹下的java文件中的任何位置。在构建步骤中,应该将其复制到.class文件中的输出文件夹中。getResource()调用应该获得一个相对于.class文件的URL,并且无论源文件是否存在,它都应该工作。因此,您是说,当我执行项目时,src中的图像会自动复制到构建中,因此在项目中有两个图像副本是正常的,但是,如果我从构建中手动删除它们,它不会再次从src复制它们,它只是抛出异常。我说得对吗?