Использование getResource () для получения и отображения значков в JList - PullRequest
2 голосов
/ 30 октября 2011

У меня проблемы с отображением значков в JList, который я создал. Я передаю путь к функции getResource (), а затем сохраняю ресурс в объекте URL. Однако каждый раз, когда я вызываю функцию getResource (), она возвращает ноль, даже если изображения существуют в каталоге.

Я пытался посмотреть на 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 ]

3 голосов
/ 30 октября 2011

Похоже, это должно работать. Я попытался запустить следующее с файлом 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 и посмотрите, если это имеет значение.

3 голосов
/ 30 октября 2011

Поскольку неловко показывать все соответствующие факторы, может быть трудно определить проблему в вашей конкретной ситуации. Вместо этого вы можете начать с этого рабочего примера и сравнить его с собственной реализацией.

...