Невозможно добавить изображение к кнопке с помощью getResource () (получить NullPointerException - создание проекта с помощью муравья)

1

Я знаю, что это очень распространенная ошибка, и я уже читал десятки сообщений о таких ошибках на SO, но по какой-то причине абсолютно ничего не получается.

Моя конечная цель - прочитать изображение из определенного места (в конкретной папке данных), которое присутствует на том же уровне, что и src в папке проекта, и создать кнопку с этим изображением. Тем не менее, я, похоже, не могу прочитать изображение и продолжать получать нуль.

Более того, я пробовал все возможные комбинации, о которых я мог подумать: gitinit.png
//gitinit.png
\gitinit.png
/gitinit.png
\gitinit.png
Данные /gitinit.png
данные //gitinit.png
данные \gitinit.png
данные \gitinit.png

все из чистого, бессмысленного разочарования...

Я использую Eclipse. Тем не менее, проект строится с муравьями.

Вот структура моего проекта:

Изображение 174551

Как видно, я добавил gitinit.png везде, но безрезультатно.

Когда я где-то читал, я даже пытался добавить папку данных в путь сборки, но опять же, безнадежно.

Я понимаю, что в этом случае абсолютный путь формы "/data/gitinit.png" был бы идеальным, но вот еще одна проблема. Я работаю над инструментом для обработки. Инструмент вызывается изнутри Обработки при его запуске. Когда я бегу

System.out.println(this.getClass().getResource("/").getPath());

Я получаю следующий вывод:

/C: /Program%20Files/processing-2.1.1-windows64/processing-2.1.1/lib/

(с/до C :). Эта папка имеет следующее содержимое:

Изображение 174551

но когда я бегу

System.out.println(this.getClass().getResource("").getPath()); 

Я получаю следующий вывод:

Файл: /C: /Users/MYPC/Documents/Processing/tools/GitManager/tool/GitManager.jar/git_manager/инструмент/

Содержимое этого файла jar:

Изображение 174551

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

// some other function that executes during runtime
        ImageIcon init = createImageIcon("gitinit.png", "git init Icon");
    System.out.println("-------------------------------------");

    loadImage("gitinit.png");

    b.setIcon(new ImageIcon(("src\\gitinit.png")));
    System.out.println(b.getIcon());


public Image loadImage(String theFilename) {
    if (theFilename.startsWith(File.separator)) {
        return new ImageIcon(theFilename).getImage();
    } else {
        URL img;
        try{
        img = this.getClass().getResource(getPath(theFilename));
        return new ImageIcon(img).getImage();
        }
        catch (NullPointerException n)
        {
            //System.out.println("Null pointer Exception");
            n.printStackTrace();
            return null;
        }
    }
}

    protected ImageIcon createImageIcon(String path, String description) {
    java.net.URL imgURL;
    try{
    //imgURL = GitOptionToolbar.class.getResource(path);
        imgURL = GitOptionToolbar.class.getClass().getResource(path);
    }
    catch(NullPointerException n)
    {
        imgURL = null;
        System.out.println("null");
    }
    if (imgURL != null) {
        System.out.println("Found " + path);
        return new ImageIcon(imgURL, description);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

public String getPath(String theFilename) {
    if (theFilename.startsWith("/")) {
        return theFilename;
    }
    return File.separator + "data" + File.separator + theFilename;
}

Итак, хорошо, что я думаю, нужно как-то продвинуть настоящий путь на 3 уровня, затем использовать относительные "data/gitinit.png" или "data/tools/xyz.png", но как мне сделай это?

Кроме того, является ли эта гипотеза правильной?

Я знаю, что этот вопрос очень длинный, и мне очень жаль, я просто хотел показать все свои эксперименты до сих пор. Кроме того, я знаю, что многие вещи случайны, особенно проверяя различные комбинации имени папки,/,\и filename, а также помещая gitinit.png в каждую возможную папку, и я также извиняюсь за это. Просто, что я хотел попробовать все, что мог, прежде чем публиковать здесь :)

Благодарю!

Теги:
ant
swing

1 ответ

1
Лучший ответ

Вы должны использовать

getResource("/data/toolbar/logos/gitnit.png")

Полный путь от data до самого образа. Не I'n привыкли к использованию Eclispe и не используется для имеющих "данных" реж на тот же уровень, на src. В Netbeans у меня это в src, но похоже, что Eclipse позаботится об этом для вас, глядя на ваше изображение.

  • 0
    Извините, но это не работает :(. Gitinit.png присутствует как в данных, так и в папках данных / панели инструментов, поэтому я не думаю, что это может вызвать проблему. Более того, Eclipse не позаботился о добавив данные в src, я сделал это вручную, основываясь на нескольких предложениях, когда у других пользователей были подобные проблемы с SO. Возможно, эта проблема больше связана с тем, что я делаю неправильно при создании проекта?
  • 0
    Вы пытались поместить изображение в ваш пакет data.toolbar.logo ? делать это и использовать путь выше всегда работает для меня
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню