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

How to use an image in a java project without an absolute path

我一直在做一个小项目来练习编程。基本上已经完成了,但是我不满意,直到我能正确使用图像,不胜感激。

所以,目前我正在使用 ImageIcon class 中的 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" 包。

非常快速的 google 搜索结果如下:

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 的丑陋一点,从未完全清理过。

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

Image image = new ImageIcon(this.getClass().getResource("/images/MyImage.jpg")).getImage();

如果你的class扩展了Applet,你可以这样做:

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

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

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