Невозможно изменить значок jFrame/загрузить ресурс для .jar с помощью Eclipse

Я пытаюсь загрузить ImageIcon, как описано здесь, но я получаю сообщение об ошибке. Пробовал метод здесь, но столкнулся с той же ошибкой. В нем говорится:

"Неперехваченная ошибка при загрузке изображения:
java.lang.NullPointerException..."

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

setIconImage(new ImageIcon("etc/image.png").getImage());

Но тогда это не работает с .jar.

EDIT: используя

Image im = ImageIO.read(new File("etc/image.png"));  

И затем создание ImageIcon не дает мне ошибок, но не работает с .jar, даже если я использую параметр «Экспорт», как описано здесь.

РЕДАКТИРОВАТЬ 2: Хорошо, размещение моей папки /etc в папке /bin, созданной для проекта, решило эту проблему. Я АБСОЛЮТНО НЕ ПОНИМАЮ, почему, поэтому я был бы благодарен, если бы кто-нибудь объяснил мне это. Подожди, неважно. Это не работает для .jar.

EDIT 3: Решение проблемы здесь.

По сути, вы создаете папку в /src, а затем импортируете в нее файлы. Чувак, не могу поверить, что потерял столько времени из-за этого. ЯРОСТЬ


person zxcvbnm    schedule 05.01.2010    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE (pscode.org/sscce.html), основанный на методе getResource. , и структуру Jar (как выводит инструмент jar).   -  person Andrew Thompson    schedule 07.03.2011


Ответы (2)


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

Что вы можете попробовать, так это следующее (простое решение, лучше использовать какой-то слушатель, я думаю):

ImageIcon imageIcon = new ImageIcon("etc/image.png");

int loadingDone = MediaTracker.ABORTED | MediaTracker.ERRORED | MediaTracker.COMPLETE;

while((imageIcon.getLoadStatus() & loadingDone) == 0){
   //just wait a bit...
}
if(imageIcon.getLoadStatus() == MediaTracker.COMPLETE)
    setIconImage(imageIcon.getImage());
else {
    //something went wrong loading the image...
} 

MediaTracker — это java.awt.MediaTracker.

person Fortega    schedule 05.01.2010

Я использую этот фрагмент, замените Config на ваше имя класса.

public static ImageIcon loadImageIcon(String filename) {

    URL url = Config.class.getClassLoader().getResource( IMAGE_DIR + filename);
    if (url == null) {
        System.err.println("No image for " + filename);
        return null;
    }
    ImageIcon icon = new ImageIcon(url);
    return icon;
}
person stacker    schedule 05.01.2010
comment
этот код возвращает мне ноль. Я не понимаю, изображение есть. - person zxcvbnm; 05.01.2010
comment
жаль это слышать, вы сначала получаете сообщение об отсутствии изображения, чтобы у вас не было проблем с загрузчиком классов. вы пытаетесь загрузить большие изображения? так что, возможно, не стоит совмещать оба предложения. Я использовал это для загрузки значков 16x16, и у меня никогда не было белых пятен в моем приложении. - person stacker; 05.01.2010
comment
У меня долгое время были проблемы с загрузкой иконок для фреймов, пока я не понял, что используется неправильный загрузчик классов (загрузчик классов начальной загрузки). Чтобы получить загрузчик класса контекста, более надежно использовать this.getClass().getResource(IMAGE_DIR + filename); - поскольку «это» нельзя вызвать ни из чего, кроме пользовательского класса, который должен быть загружен загрузчиком класса контекста. - person Andrew Thompson; 07.03.2011