如何在NetBeans中正确从“资源”文件夹获取图像

37

我在NetBeans 7.0中有一个Java项目。

我想动态地将某些图像添加到标签上。该图像将根据程序的状态而有所不同。

我将一个名为'filling.jpg'的图像放在我的项目的'resources'文件夹中。

我想要正确地访问这个文件(不使用绝对或相对路径,因为在构建jar文件时会引起问题)。

因此我找到了这个方法:

ImageIcon fillingIcon = new ImageIcon(getClass().getClassLoader().getResource("filling.jpg"));
labelFontFilling.setIcon(fillingIcon);

它一直给我java.lang.NullPointerException的错误。 但我确定那个图片是存在的,因为我可以通过NetBeans属性菜单将图片分配给标签(但我不想这样做,我想通过Java代码添加图片)。

我做错了什么,如何才能正确获得那张图片?


2
你能打印出给定的路径吗?就像System.out.println(getClass().getClassLoader().getResource("filling.jpg"))一样,这可以给你一个关于你试图使用的路径的线索。 - Valter Silva
2
你的项目中创建了资源文件夹吗?它在类路径中吗? - jmj
1
这里有很好的建议:https://dev59.com/e3VC5IYBdhLWcg3wjx_u - vkraemer
可能是重复问题:如何在JAR文件中打包图像 - vkraemer
这个解决方案适用于我:https://dev59.com/CGUo5IYBdhLWcg3wzSIq - Yasitha Waduge
显示剩余2条评论
4个回答

49

使用NetBeans IDE 7.2真是一件痛苦的事情。

  1. 请记住,每次重新构建时Netbeans都会清理Build文件夹,因此
  2. src文件夹中添加一个资源文件夹:

    • (项目)
      • src
        • 项目包文件夹 (包含.java文件)
        • resources (任何名称)
        • images (可选子文件夹)
  3. 清理/构建后,此结构将传播到Build文件夹中:

    • (项目)
      • build
        • classes
          • 项目包文件夹 (包含生成的.class文件)
          • resources (您的资源)
          • images (您的可选子文件夹)

访问这些资源:

dlabel = new JLabel(new ImageIcon(getClass().getClassLoader().getResource("resources/images/logo.png")));

并且:

if (common.readFile(getClass().getResourceAsStream("/resources/allwise.ini"), buf).equals("OK")) {

对我有用。请注意,在一种情况下,路径前面有一个斜杠,而在另一种情况下则没有。 因此,资源路径的根目录是构建文件夹中的"classes"文件夹。

在dist文件夹中双击可执行jar文件。资源路径仍然有效。


这对我来说有点不清楚。图片文件夹应该放在资源文件夹里面还是与其并列? - retrovius

25

我有一个稍微不同的方法,可能对某些人更有用/更有益。

在您的主项目文件夹下创建一个资源文件夹。您的文件夹结构应该如下所示。

  • 项目文件夹
    • build
    • dist
    • lib
    • nbproject
    • resources
    • src

转到您的项目属性。您可以通过右键单击项目选项卡窗口中的项目,并在下拉菜单中选择“属性”来执行此操作。

在左侧的类别下,选择“源”。

在右侧的源包文件夹中,使用“添加文件夹”按钮添加您的资源文件夹。一旦您单击“确定”,您应该在项目下看到一个“资源”文件夹。

enter image description here

现在,您应该能够使用此行或类似方法来提取资源:

MyClass.class.getResource("/main.jpg");

如果您在资源文件夹下创建名为Images的软件包,可以像这样检索资源:

MyClass.class.getResource("/Images/main.jpg");

1
我使用了这种方法,但发现有一个令人不安的影响。在构建NetBeans之后,它会加载jar内的所有资源,而我真的希望这些资源留在jar外!那么,有没有解决这个问题的方法? - Saïd Tahali
很遗憾,Java资源方法可能不完全符合您的要求。但是,如果您的文件驻留在类路径中,您可以尝试使用ClassLoader.getSystemResource("somefile.txt")……您也不再需要像上面所述那样包含资源文件夹。另一个选择是在JAR的父目录(或静态路径)中查找给定文件(资源),并使用File或其他等价物打开它们以适应您的需求。如果文件不存在,则从JAR中存储的资源创建它们。在这种情况下,它们更像是模板。 - Matthew Pautzke

20

谢谢Valter Henrique的提示,我意识到我只是输入了错误的图片路径。 在我的一次尝试中,我使用了

    String pathToImageSortBy = "resources/testDataIcons/filling.png";
    ImageIcon SortByIcon = new ImageIcon(getClass().getClassLoader().getResource(pathToImageSortBy));

但正确的方法是在资源路径中使用我的项目名称。

String pathToImageSortBy = "nameOfProject/resources/testDataIcons/filling.png";
ImageIcon SortByIcon = new ImageIcon(getClass().getClassLoader().getResource(pathToImageSortBy));

1

对我而言,这段代码的作用是在src文件夹下创建了一个icons文件夹,并写入了以下代码:

new ImageIcon(getClass().getResource("/icons/rsz_measurment_01.png"));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接