2

我试图弄清楚如何将大量图像添加到我的 Java 程序中,而不必在代码中添加每个文件名。

所以我想把所有.png图像放在正确的文件夹中IconImage,然后将它们放入一个ArrayList.

我现在得到的就是这个。

private void fillList()
{
    File[] files = new File("C:/Users/marre/Google Drive/Java/lek/imageplay/src/img").listFiles();

    for (File f : files)
    {
        if (f.isFile()) 
        {
                ImageIcon tempIcon = new ImageIcon(getClass().getResource("/img/"+f.getName()));       
                List.add(tempIcon);
        }
    }
}    

这可以按照我想要的方式来获取所有图像的名称。但该文件仅从绝对文件路径读取。

我可以使用什么来获得相同的结果,但它在 .jar 文件中有效(因此它读取src/img/而不是整个c:/ bla bla..)?

4

1 回答 1

0

我不确定这是否会有所帮助,但我在尝试获取 jar 文件中的文件时遇到了类似的问题。如果这对您有用,我的方法是使用以下方法获取 jar 中文件的 URL ClassLoader

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL url = classLoader.getResource("src/img/");

检查您的 jar 以确保图像的目录结构,以便您可以指定正确的相对路径。

请记住,jar 是一种打包形式,因此它很可能会返回一个压缩文件(而不是简单的File对象)。你可能不得不涉足ZipFile

ZipFile folderInsideJar = new ZipFile(new File(url.getPath());
Enumeration<? extends ZipEntry> entries = folderInsideJar.entries();
while (entries.hasMoreElements()) {
     // ideally this would be your image file, zipped
    ZipEntry childFile = entries.nextElement();

    // ... etc ...
}

对于 JBoss 等环境,您可能还会获得虚拟文件 (vfsfile/vfszip)。重点是,您可以通过查看结果URL.getProtocol()来确定您正在处理的内容。

看起来 ImageIcon 有一个带有 URL 的构造函数。在手动尝试检索 zip 文件之前,您可以尝试看看它是否处理了“jar 内的资源”情况。

于 2012-12-27T22:34:48.027 回答