Проблем при използване на изображение от друг локален пакет

Имам 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);

Нищо не работи към момента. Какво правя грешно. Пакетът от изображения се нарича изображения.


person Shashwat    schedule 13.08.2011    source източник
comment
доста отговорено от @mre в stackoverflow.com /questions/7014123/   -  person mKorbel    schedule 13.08.2011
comment
Опитах да търся преди, но не можах да намеря отговора, който сте публикували. Ще проверя :)   -  person Shashwat    schedule 13.08.2011
comment
Опитах да използвам .. (родителска директория към текуща директория) преди, но не проработи. Ще проверя отново.   -  person Shashwat    schedule 13.08.2011


Отговори (1)


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() ще върне друг клас, ако е извикан от подклас, и по този начин относителният път ще сочи към друго местоположение, което в повечето случаи не е желаното.

person JB Nizet    schedule 13.08.2011
comment
@JB Благодаря, човече, за такова хубаво обяснение. Но това нещо не работи с клас Image. Искам логото да съхранява иконата за приложението. SetIconImage() зависи от Image, но не и от ImageIcon. logo = Toolkit.getDefaultToolkit().getImage("/images/icon.png"); - person Shashwat; 13.08.2011
comment
Наистина трябва да се научите да четете javadoc (download.oracle.com/javase/6 /docs/api). 1.ImageIcon.getImage() връща обект Image. 2. Toolkit.getDefaultToolkit().getImage() приема име на файл като аргумент, а не път на ресурс. Има претоварен метод getImage(), който обаче приема URL като аргумент, а URL е това, което се връща от Class.getResource(). - person JB Nizet; 13.08.2011
comment
Благодаря, човече :) Наистина чета документите, но не толкова подробно :) Благодарение на вас, момчета, моят проект е завършен. Просто трябва да го полирам повече. - person Shashwat; 13.08.2011