Java: Когда программа редактируется .jar, она больше не читает изображения в файле jar? - PullRequest
3 голосов
/ 06 декабря 2009

Мне нужно, чтобы файлы не экспортировались на компьютер.
На данный момент мой код для хранения изображений:

ImageIcon icon = new ImageIcon("images\\images2.gif");

Это не может быть просто изображение, так как я добавляю его в JLabel.
Когда я запускаю всю программу, она сохраняет файлы изображений в банке.
Когда я иду, чтобы запустить актуальную проблему, нет изображений.

Опять же, я не могу просто оставить .jar в папке с изображениями. Он должен работать на отдельном компьютере сам по себе.

Ответы [ 7 ]

10 голосов
/ 06 декабря 2009

Вы хотите получить изображение через системный загрузчик классов:

URL url = ClassLoader.getSystemClassLoader().getResource("images/images2.gif");
Icon icon = new ImageIcon(url)

images находится в корне пути к классам.

Обратите внимание, что среда выполнения Java преобразует разделитель (/) в специальный разделитель ОС (\ для Windows).

3 голосов
/ 06 декабря 2009

Вам нужно получить доступ к этим файлам через загрузчик классов ... Примерно так:

InputStream is = this.getClass().getClassloader().getResourceAsStream("images/image.ico");

НТН

UPD: обратите внимание, что это будет работать как с пакетом JARed, так и с простой структурой каталогов.

0 голосов
/ 10 сентября 2013

Если ваши изображения расположены таким образом.

enter image description here

Тогда это должно сделать работу.

 private String imageLocation "/images/images2.png";


private ImageIcon getImageIconFromJar(String imageLocation)
{
    try
    {
        BufferedImage bi = ImageIO.read(this.getClass().getResource(imageLocation));
        ImageIcon ic = new ImageIcon(bi);

        return ic;
    } catch (IOException e)
    {
        System.out.println("Error: "+e);
    }
    return null;
}
0 голосов
/ 21 августа 2012

Я полагаю, что images2.gif находится внутри пакета изображений

URL imageurl = getClass().getResource("/images/images2.gif"); 
Image myPicture = Toolkit.getDefaultToolkit().getImage(imageurl);
JLabel piclabel = new JLabel(new ImageIcon( myPicture ));
piclabel.setBounds(0,0,myPicture.getWidth(null),myPicture.getHeight(null));
0 голосов
/ 18 декабря 2010

Вот удобный класс утилит, который можно использовать для загрузки ресурсов изображения. Регистратор log4j может быть удален или заменен на более подходящий.

public class ResourceLoader {

    private static final Logger logger = Logger.getLogger(ResourceLoader.class);

    public static Image getImage(final String pathAndFileName) {
         try {
              return Toolkit.getDefaultToolkit().getImage(getURL(pathAndFileName));
        } catch (final Exception e) {
              logger.error(e.getMessage());
              return null;
         }
    }

    public static ImageIcon getIcon(final String pathAndFileName) {
         try {
             return new ImageIcon(getImage(pathAndFileName));
         } catch (final Exception e) {
             logger.error(e.getMessage());
             return null;
         }
    }

    public static URL getURL(final String pathAndFileName) {
         return Thread.currentThread().getContextClassLoader().getResource(pathAndFileName);
    }
}
0 голосов
/ 06 декабря 2009

Основная проблема заключается в том, что класс File знает, как работать только с тем, что базовая операционная система считает файлом, и с целым.

Файл jar - это, по сути, zip-файл с некоторой дополнительной информацией, поэтому вы не можете использовать File с этим. Вместо этого Java предоставляет концепцию «ресурса», которая примерно переводится как «кусок байтов или символов, которые нам безразличны, где они есть, если они у нас есть, когда они нам нужны». Вы можете запросить загрузчик классов для любого ресурса в пути к классам - что вам здесь нужно - или получить к нему доступ через URL.

0 голосов
/ 06 декабря 2009

Попробуйте это:

ImageIcon icon = new ImageIcon(this.getClass().getClassloader().getResource("images/images2.gif"));

если это не сработает, замените this.getClass (). GetClassloader () на MyClass.class, где MyClass - это имя вашего класса.

Я помню, что мне пришлось немного отредактировать это, чтобы оно работало в Eclipse, но при его развертывании оно работает как чудо.

Редактировать: чтобы заставить его работать в Eclipse, вам может потребоваться изменить его на:

ImageIcon icon = new ImageIcon(this.getClass().getClassloader().getResource("bin/images/images2.gif"));

Если это не сработает, выполните стандарт, замените this.getClass (). GetClassloader () на MyClass.class. Если это все еще не работает, попробуйте заменить «bin» на «src». Попробуйте сделать это первым способом и посмотрите, что получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...