我在制作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。它没有在构建路径中注册资源。一个简单的“刷新修复了问题。感谢大家的帮助。答案 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文件中运行,看看它是否有所作为。