使用getResource()来检索和显示JList中的图标

时间:2011-10-30 12:11:02

标签: java swing awt jlist

我在制作JList中的图标时遇到问题。我将路径传递给函数getResource(),然后将资源存储在URL对象中。但是,每次调用getResource()函数时,它都会返回null,即使目录中存在图像。

我已经尝试过浏览stackoverflow和其他网站,但我找不到解决这个问题的方法。我甚至尝试将图像存储在项目目录中的多个位置,但无济于事。如果有帮助,我正在使用Eclipse IDE。所以我将文件存储在/ src /,/ src / resources /和项目文件夹中。

这是我的代码:

import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import javax.swing.*;

@SuppressWarnings("serial")
public class JListRenderer extends DefaultListCellRenderer
{   
    private static ArrayList<CakeRecipe> cRecipes;
    private ImageIcon[] images;

    // Index of cake recipe
private int cakeIndex;

JListRenderer(ArrayList<CakeRecipe> recipes)
{
    cRecipes = recipes;
            // Initializes an array of ImageIcons FileHander.jpgCounter() counts the amount of JPG's in the folder, FileHandler.getPath() gives you the filepath
    images = new ImageIcon[FileHandler.jpgCounter(new File(FileHandler.getPath()))];

    for(int i = 0, j = images.length; i < j; i++)
        images[i] = createImageIcon("/resources/" + cRecipes.get(cakeIndex).getPhoto()); // cRecipes.get().getPhoto() gives you the filename of the village only (e.g.: photo.jpg)
}

protected static ImageIcon createImageIcon(String path)
{
    URL imgURL = JListRenderer.class.getResource(path);

    if(imgURL != null)
        return new ImageIcon(imgURL);
    else
    {
        System.err.println("Could not find image. Certain menu elements may not display properly");
        return null;
    }
}

...

此代码是否有效或我是否正确使用了URL或getResource()?图像在目录中,我传递的路径与图像的路径相同。例如:

"/resources/photo.jpg"

非常感谢任何帮助。谢谢。

编辑:问题在于Eclipse。它没有在构建路径中注册资源。一个简单的“刷新修复了问题。感谢大家的帮助。

2 个答案:

答案 0 :(得分:3)

因为显示所有相关因素很尴尬,在您的特定情况下可能很难确定问题。相反,您可以从这个工作example开始,并将其与您自己的实现进行比较。

答案 1 :(得分:3)

它看起来应该有效。我尝试使用资源包中的test.txt文件运行以下命令:

package resourcestest;

import java.io.File;
import java.io.FileReader;
import java.net.URL;

public class Test {

    public static void main(String[] args) throws Exception {

        final URL test = Test.class.getResource("/");
        System.out.println(test);

        final URL url = Test.class.getResource("/resources/test.txt");
        System.out.println(url);

        if(url == null) {
            System.out.println("URL is null");
        } else {
            final File file = new File(url.toURI());
            final FileReader reader = new FileReader(file);
            final char[] buff = new char[20];
            final int l = reader.read(buff);
            System.out.println(new String(buff, 0, l));
            reader.close();
        }

    }

}

main方法中的前两个语句可用于找出在运行时被视为相对根的路径。

我在NetBeans和Eclipse中尝试过这种方法,在这两种情况下都可以使用。现在,真正的问题是,您的项目设置是什么以及如何构建?源和类文件是否有单独的文件夹,还是它们放在一起?您是使用Ant脚本还是Eclipse构建方法?

如果你只将文件放在一个文件夹而不是一个包中,那么它们不确定它们是在编译路径上还是在运行时类路径上。我怀疑后者可能就是这种情况。尽量确保resources是一个包,而不是一个文件夹。尝试从项目中创建一个jar文件,然后检查其内容以查看是否包含了您的资源。尝试从jar文件中运行,看看它是否有所作为。