使用getClass()加载资源.getResource()

时间:2010-02-26 16:42:51

标签: java swing

我正在尝试加载图像以在我的应用程序中用作图标。根据此tutorial的适当方法是:

protected ImageIcon createImageIcon(String path, String description) 
{
    java.net.URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL, description);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

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

ImageIcon icon  = new ImageIcon(path,"My Icon Image");

效果很好!因此,应用程序可以从显式定义的路径中获取图像,但是没有使用getResources()来获取图像。在这两种情况下,path变量的值都是相同的。为什么它不起作用?如何通过类加载器找到资源?

感谢。

5 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:14)

您可以使用以下格式请求路径:

/package/path/to/the/resource.ext

甚至用于在内存中创建类的字节也是这样找到的:

my.Class -> /my/Class.class

getResource会为您提供一个可用于检索InputStream的网址。

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

简而言之:尝试使用getResourceAsStream和使用ImageIcon作为参数的InputStream构造函数。

<强>类加载器

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

编辑:classpath

getResource - 就像mattb所说 - 用于从类路径(从.jar或classpath目录)加载资源。如果您要捆绑一个应用程序,那么完全可以使用它,因此您可以将图标文件包含在应用程序的jar中并以此方式获取。

答案 2 :(得分:7)

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

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

FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("../app1.fxml"));

请注意,在此相对路径字符串“../app1.fxml”中,前两个点引用包含Main.class的目录和单个“。”。表示要遵循的文件扩展名。在这些细节成为第二天性之后,你会忘记它为何令人困惑。

答案 3 :(得分:1)

getResourceAsStream()在资源文件夹中查找。因此,将文件池放置在已定义的资源文件夹内 也就是说,如果文件位于/ src / main / resources / properties->中,则路径应为/ properties / yourFilename。

getClass.getResourceAsStream(/ properties / yourFilename)

答案 4 :(得分:0)

getResource示例:

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();
    }
}

enter image description here

输出:

test1: file:/home/szb/projects/test/bin/szb/testGetResource/test.css
test2: file:/home/szb/projects/test/bin/szb/testGetResource/test.css