Проблема с использованием изображения из другого локального пакета - PullRequest
4 голосов
/ 13 августа 2011

У меня есть JLabel в кадре, который я хочу иметь разные изображения при нажатии на разные кнопки. Достичь этого было легко. Вот код

    ImageIcon icon = new ImageIcon (img);
    icon.getImage().flush();
    shopBanner.setIcon(icon);

Проблема i0, ранее я указывал полный путь к изображению, например C: \ Documents \ xxx. Теперь, когда я попробовал банку на каком-то другом компьютере, я заметил, что изображения не используются, это было очевидно, поскольку назначенный путь не существует на другом компьютере.

Вернувшись в проект, у меня есть 2 пакета, один для изображений, называемых изображениями, и другой для исходных файлов, называемых smartshopping. Я попытался использовать пару кодов, но не смог назвать изображение из пакета "images". Пожалуйста, помогите мне решить проблему. Проект отлично работает на "моем" компьютере, если я предоставлю полный путь как C: / Docs ....

Вот код

    Image img = ImageIO.read(getClass().getResource("images/bb-banner-main.jpg"));
    ImageIcon icon = new ImageIcon (img);
    icon.getImage().flush();
    shopBanner.setIcon(icon);

Я даже пытался

    URL img= this.getClass().getResource("images/icon.png");
    ImageIcon imageIcon = new ImageIcon(img);
    //icon.getImage().flush();
    shopBanner.setIcon(imageIcon);

Ничего не работает на данный момент. Что я делаю неправильно. Пакет с изображениями называется images.

1 Ответ

8 голосов
/ 13 августа 2011

Foo.class.getResource("images/icon.png") считает images/icon.png относительным путем к Foo.class.Поэтому, если Foo находится в пакете com.bar, он будет искать com/bar/images/icon.png.

Поставить косую черту в начале пути, чтобы сделать его абсолютным (то есть начать с корня пути к классам).

Кстати, вы делаете это излишне сложным.Нет необходимости читать изображение с помощью ImageIO или сбрасывать изображение.Просто сделайте

ImageIcon icon = new ImageIcon(Foo.class.getResource("/images/icon.png"));

Примечание: я предпочитаю жесткое кодирование Foo.class вместо использования getClass(), потому что getClass() будет возвращать другой класс, если он вызывается подклассом, и, таким образом, относительный путь будет указывать на другойместоположение, которое в большинстве случаев не является тем, что нужно.

...