Мой файл jar не загружает изображения

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

Вот код, который я использую:

Чтобы загрузить изображение, которое я использую:

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

для URL-адреса я также пробовал просто

 getClass().getResource(path)

Строка, где должно быть создано изображение:

this.img =createImageIcon(File.separator+"."+File.separator
           +"resources"+File.separator+"tiles"+File.separator+"tile.png","tile");

Мой файл jar настроен на папку, содержащую файлы классов, и папку ресурсов на верхнем уровне.

Я искал способы решить эту проблему, но я не могу найти ничего, что работает.

Спасибо.


person Tyler Sutherland    schedule 13.01.2011    source источник
comment
В вашей функции createImageIcon вы передаете имя файла, в котором будет создано изображение? Потому что, если это так, это означает, что файл сохраняется в /./resources/tiles/tile.png, что эквивалентно /resources/tiles/tile.png, который будет находиться на корневом уровне файловой системы. В этом случае он не будет найден вашим путем к классам после его развертывания.   -  person Jaime Garcia    schedule 13.01.2011
comment
как насчет использования / вместо File.separator и использования /resources/titles/tile.png вместо /./resources/titles/tile.png, что может быть неправильным путем в зависимости от системы   -  person dvhh    schedule 13.01.2011


Ответы (3)


Ваш URL будет оцениваться как "/./resources/tiles/tile.png", что не имеет смысла (но, возможно, ClassLoader, который используется при запуске из NetBeans, допускает ошибку.)
Попробуйте удалить первоначальный "/./". Также вам не нужны ссылки на File.separator, поскольку строка обрабатывается как относительный URL-адрес, а косая черта всегда действительна.

person finnw    schedule 13.01.2011

Вместо /./resources/back_img.png используйте resources/back_img.png с ClassLoader.
Вот пример:

    String path = "resources/back_img.png";
    ClassLoader cl = ImageHandler.class.getClassLoader();
    URL imgURL = cl.getResource(path);
    //URL imgURL = ImageHandler.class.getResource(path);

    if (imgURL != null) {
        ImageIcon icon = new ImageIcon(imgURL, description);
        Image img = icon.getImage();
        Image sizedImg = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
        return new ImageIcon(sizedImg);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
person duypt    schedule 06.10.2011

Несмотря ни на что, ваш код обладает незавидным свойством отказоустойчивости.

Попробуйте что-то вроде

URL x = get class.getclassloader.getresource(...)
If x == null
   Throw new defect "expected ... But it wasn't there"

Извините за форматирование, но iPad делает это слишком сложно.

person time4tea    schedule 13.01.2011