Как установить изображение значка для приложения Swing?

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

Вот «мой» код (сильно заимствованный из других постов и интернета в целом):

public class MyApp extends JFrame
{
    public MyApp()
    {
        ImageIcon myAppImage = loadIcon("myimage.jpg");
        if(myAppImage != null)
            setIconImage(myAppImage.getImage());
    }

    private ImageIcon loadIcon(String strPath)
    {
        URL imgURL = getResource(strPath);
        if(imgURL != null)
            return new ImageIcon(imgURL);
        else
            return null;
    }
}

Этот код дает сбой в loadIcon при вызове метода getResource(). Для меня здесь есть только 2 возможности: (1) myImage.jpg находится в неправильном каталоге или (2) getResource() что-то не нравится в моем изображении (мне пришлось преобразовать его из CMYK в RGB в Photoshop, чтобы я мог использовать то же изображение в другом месте с ImageIO.)

Я использовал трюк System.out.println(new File(".").getAbsolutePath());, чтобы найти каталог, в котором должно храниться изображение JPG, и все равно ничего не сработало. Впоследствии я поместил JPG практически в каждый каталог внутри моего проекта, просто чтобы исключить местоположение файла как виновника.

Так что это заставляет меня поверить, что getResource() что-то не нравится в самом JPG. Но я уже исчерпал свое понимание образов и иконок в могучем, широком мире Swing.

Мой JPG нормально загружается в других программах для просмотра изображений, так что это тоже исключено. У кого-нибудь есть идеи?

Заранее спасибо!


person IAmYourFaja    schedule 25.08.2011    source источник
comment
Чтобы проверить, связана ли проблема с URL-адресом, попробуйте: System.out.println("estimated number of bytes in the file = " + imgURL.openStream().available());.   -  person toto2    schedule 25.08.2011
comment
Спасибо toto2 - теперь мы наконец-то к чему-то пришли! Эта строка выдает исключение с сообщением null... пожалуй, самое худшее и наименее полезное сообщение об исключении, которое я когда-либо видел. Любые подсказки?   -  person IAmYourFaja    schedule 25.08.2011
comment
available не является надежным методом в соответствии с API, поэтому мы не можем сделать много выводов. Вы можете попробовать разделить openStream().avalaible() на две разные строки, чтобы увидеть, откуда возникла ошибка. Я предполагаю, что ваше изображение в порядке, но не может быть найдено. Поскольку вы используете NetBeans, вы также можете ознакомиться с этим учебным пособием< /а>.   -  person toto2    schedule 25.08.2011
comment
@Мар, почему у тебя ничего не работает? Почему не были предложены в этой публикации (stackoverflow.com /questions/7181699/) работают на вас, когда они работают на всех остальных?? Почему вы не можете опубликовать SSCCE, как вас просили сделать раньше??? Мы НЕ умеем читать мысли, мы не можем догадаться, почему это работает для всех, а не для вас!!!   -  person camickr    schedule 25.08.2011
comment
Camickr, пожалуйста, воздержитесь от публикации ответов на мои вопросы в будущем.   -  person IAmYourFaja    schedule 25.08.2011
comment
Извините, я обижаюсь, когда люди продолжают задавать вопросы без всей необходимой информации, необходимой для решения проблемы. Вы продолжаете тратить время всех, кто находит время, чтобы прочитать этот вопрос. Мало того, у вас хватило наглости отправить мне электронное письмо из моего блога с просьбой о помощи, когда вы не хотите, чтобы я помогал вам здесь!   -  person camickr    schedule 25.08.2011


Ответы (5)


поместите изображение в корень пути к классам и скажите getResource("classpath:myimage.jpg");

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

Вот хорошая ссылка на путь к классам

person Anantha Sharma    schedule 25.08.2011
comment
Я понимаю, что путь к классам - это каталог, в котором JRE будет искать файлы .class. Если это так, то мой NetBeans автоматически создает довольно сложный каталог сборки/, в котором есть папка с именем class/, которая сама содержит мой пакет com/ верхнего уровня, META-INF/ и res/. Я поместил изображение в каждый из этих каталогов и добавил префикс classpath: string в вызове getResource, как вы указали. Все еще не идет ... Я все еще думаю, что ему не нравится JPG - person IAmYourFaja; 25.08.2011

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

Попробуйте поместить изображения в отдельную папку за пределами папки src. Затем используйте ImageIO для загрузки изображений. (ответ дан 27 авг.

frame.setIconImage(ImageIO.read(new File("res/icon.png")));
person Vidu    schedule 12.08.2014

Должен быть

if(imgURL != null)
           ^

вместо

if(imgURL !- null)

и

URL imgURL = this.getClass().getResource(strPath);

вместо

URL imgURL = getResource(strPath);

Тогда все работает нормально, если "myimage.jpg" находится в одном каталоге с MyApp.class

person oliholz    schedule 25.08.2011
comment
Спасибо, но первый (imgURL !- null), очевидно, был опечаткой, так как он никогда не скомпилировался. Сделал второе изменение, как вы рекомендовали, и убедился, что изображение находится в той же папке, что и MyApp.class. Все равно не пройти... - person IAmYourFaja; 25.08.2011

Два предложения:

  1. Попробуйте использовать getClass().getResource("x.jpg") и поместите файл непосредственно в ту же папку, что и файл .class класса, в котором вы находитесь.
  2. Убедитесь, что имя идентично регистру — некоторые операционные системы чувствительны к регистру, а в JAR все регистрозависимо.
person Sanjay Manohar    schedule 25.09.2011

Вы можете попробовать использовать / перед именем файла.

getClass().getResource("/myimage.jpg")

Если вы заглянете в свою папку вывода сборки (цель), вы можете найти свой класс, из которого вы пытаетесь получить свой ресурс. Ваши ресурсы, вероятно, будут скопированы в какие-то папки выше.

Например, ваш целевой каталог может выглядеть так:

target
 |- de.example.app
     |- Main.class
 |- Main-x.y.z.jar
 |- myimage.jpg

So if you just go for

getClass().getResource("myimage.jpg")
it will look under the folder target/de/example/app and won't find a jpg there.
You need to tell him that you want to look under the root-folder (target/**). That's why you need to place a "/" before your file.

person Xinho    schedule 24.09.2020