Я знаю, что это очень распространенная ошибка, и я уже читал десятки сообщений о таких ошибках на SO, но по какой-то причине абсолютно ничего не получается.
Моя конечная цель - прочитать изображение из определенного места (в конкретной папке данных), которое присутствует на том же уровне, что и src в папке проекта, и создать кнопку с этим изображением. Тем не менее, я, похоже, не могу прочитать изображение и продолжать получать нуль.
Более того, я пробовал все возможные комбинации, о которых я мог подумать: gitinit.png
//gitinit.png
\gitinit.png
/gitinit.png
\gitinit.png
Данные /gitinit.png
данные //gitinit.png
данные \gitinit.png
данные \gitinit.png
все из чистого, бессмысленного разочарования...
Я использую Eclipse. Тем не менее, проект строится с муравьями.
Вот структура моего проекта:
Как видно, я добавил 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 :). Эта папка имеет следующее содержимое:
но когда я бегу
System.out.println(this.getClass().getResource("").getPath());
Я получаю следующий вывод:
Файл: /C: /Users/MYPC/Documents/Processing/tools/GitManager/tool/GitManager.jar/git_manager/инструмент/
Содержимое этого файла jar:
Вот код, который я использовал. Я использовал 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 в каждую возможную папку, и я также извиняюсь за это. Просто, что я хотел попробовать все, что мог, прежде чем публиковать здесь :)
Благодарю!
Вы должны использовать
getResource("/data/toolbar/logos/gitnit.png")
Полный путь от data
до самого образа. Не I'n привыкли к использованию Eclispe и не используется для имеющих "данных" реж на тот же уровень, на src
. В Netbeans у меня это в src
, но похоже, что Eclipse позаботится об этом для вас, глядя на ваше изображение.
data.toolbar.logo
? делать это и использовать путь выше всегда работает для меня