Java 正在使用getClass()加载资源。getResource()

Java 正在使用getClass()加载资源。getResource(),java,swing,Java,Swing,我正在尝试加载一个图像作为应用程序中的图标。根据这一点,适当的方法是: 因此,我放置了文件的位置,并将其作为参数传递给此函数。这不起作用,即imgURL为空。当我尝试通过显式传递路径来创建ImageIcon时: ImageIcon icon = new ImageIcon(path,"My Icon Image"); 它工作得很好!因此,应用程序可以从显式定义的路径拾取图像,但没有使用getResources()拾取图像。在这两种情况下,path变量的值相同。为什么它不起

我正在尝试加载一个图像作为应用程序中的图标。根据这一点,适当的方法是:

因此,我放置了文件的位置,并将其作为参数传递给此函数。这不起作用,即imgURL为空。当我尝试通过显式传递路径来创建ImageIcon时:

ImageIcon icon  = new ImageIcon(path,"My Icon Image");
它工作得很好!因此,应用程序可以从显式定义的路径拾取图像,但没有使用getResources()拾取图像。在这两种情况下,path变量的值相同。为什么它不起作用?类加载器如何找到资源


谢谢。

getClass().getResource(path)
从类路径而不是文件系统路径加载资源。

getClass().getResource(path)
从类路径而不是文件系统路径加载资源。

您可以请求以下格式的路径:

/package/path/to/the/resource.ext
甚至用于在内存中创建类的字节也是这样找到的:

my.Class -> /my/Class.class
getResource
将为您提供一个URL,可用于检索
InputStream

但是。。。我建议直接使用带有相同参数的
getClass().getResourceAsStream(…)
,因为它直接返回InputStream,并且不必担心创建一个(可能很复杂)URL对象,该对象必须知道如何创建InputStream

简而言之:尝试使用
getResourceAsStream
ImageIcon
的某个构造函数,该构造函数使用
InputStream
作为参数

类加载器

如果你的应用程序有很多类加载器,要小心。如果你有一个简单的独立应用程序(没有服务器或复杂的东西),你不必担心。我不认为是提供的情况下,
ImageIcon
能够找到它

编辑:类路径


getResource
就像mattb所说的那样,从类路径(从.jar或类路径目录)加载资源。如果您正在捆绑一个应用程序,那么最好将其合并在一起,这样您就可以将图标文件包含在应用程序的jar中,并通过这种方式获得它。

您可以请求以下格式的路径:

/package/path/to/the/resource.ext
甚至用于在内存中创建类的字节也是这样找到的:

my.Class -> /my/Class.class
getResource
将为您提供一个URL,可用于检索
InputStream

但是。。。我建议直接使用带有相同参数的
getClass().getResourceAsStream(…)
,因为它直接返回InputStream,并且不必担心创建一个(可能很复杂)URL对象,该对象必须知道如何创建InputStream

简而言之:尝试使用
getResourceAsStream
ImageIcon
的某个构造函数,该构造函数使用
InputStream
作为参数

类加载器

如果你的应用程序有很多类加载器,要小心。如果你有一个简单的独立应用程序(没有服务器或复杂的东西),你不必担心。我不认为是提供的情况下,
ImageIcon
能够找到它

编辑:类路径


getResource
就像mattb所说的那样,从类路径(从.jar或类路径目录)加载资源。如果你正在捆绑一个应用程序,那么最好将其全部打包,这样你就可以将图标文件包含在应用程序的jar中,并通过这种方式获得它。

作为一个noobie,我对此感到困惑,直到我意识到所谓的“路径”是相对于文件系统中MyClass.文件而不是MyClass.java文件的路径。我的IDE将资源(如xx.jpg、xx.xml)复制到MyClass.class的本地目录中。例如,在一个名为“目标/类别/包装。不同IDE的类文件位置可能不同,具体取决于应用程序的构建结构。您应该首先浏览文件系统,找到MyClass.class文件的位置以及要提取的关联资源的复制位置。然后确定相对于MyClass.class文件的路径,并将其作为带有“点”和“斜线”的字符串值写入

例如,在相关的“MyClass.class”隐式为“Main.class”的情况下,我如何使app1.fxml文件可用于我的javafx应用程序。Main.java文件包含这行资源调用代码。在我的特定情况下,资源被复制到与封闭包文件夹处于同一级别的位置。即:/target/classes/pkg/Main.class和/target/classes/app1.fxml。因此,解释一下……相对引用“./app1.fxml”是“从Main.class开始,上升一个目录级别,现在您可以看到资源”


请注意,在这个相对路径字符串“./app1.fxml”中,前两个点引用包含Main.class的目录,单个“.”表示后面的文件扩展名。当这些细节成为第二天性后,你就会忘记为什么会让人困惑

作为一个noobie,我对此感到困惑,直到我意识到所谓的“路径”是文件系统中相对于MyClass的路径,而不是MyClass。我的IDE将资源(如xx.jpg、xx.xml)复制到MyClass.class的本地目录中。例如,在一个名为“目标/类别/包装。不同IDE的类文件位置可能不同,具体取决于应用程序的构建结构。您应该首先浏览文件系统,找到MyClass.class文件的位置以及要提取的关联资源的复制位置。然后确定相对于MyClass.class文件的路径,并将其作为带有“点”和“斜线”的字符串值写入

例如,下面是如何使app1.fxml文件可用于javafx应用程序,其中相关的“MyClass.class”是
package szb.testGetResource;
public class TestGetResource {
    private void testIt() {
        System.out.println("test1: "+TestGetResource.class.getResource("test.css"));
        System.out.println("test2: "+getClass().getResource("test.css"));
    }
    public static void main(String[] args) {
        new TestGetResource().testIt();
    }
}
test1: file:/home/szb/projects/test/bin/szb/testGetResource/test.css
test2: file:/home/szb/projects/test/bin/szb/testGetResource/test.css