我知道这是一个非常常见的错误,我已经在SO上阅读过几十篇有关此类错误的帖子,但出于某种原因,似乎没有什么可以解决的。
我的最终目标是从特定位置(特定于数据文件夹)中读取与项目文件夹中src相同级别的图像,并创建一个包含该图像的按钮。但是,我似乎无法读取图像,并且一直无效。
此外,我已经尝试了所有可能的组合,我能想到:
gitinit.png
//gitinit.png
\ gitinit.png
/gitinit.png
\ gitinit.png
数据/ gitinit.png
数据// gitinit.png
数据\ gitinit.png
data \ gitinit.png
我正在使用Eclipse。然而,该项目正在与蚂蚁建立。
这是我项目的结构:
可见,我在任何地方都添加了gitinit.png,但无济于事。
当我在某处阅读时,我甚至尝试将数据文件夹添加到构建路径中,但又一次无望。
我意识到在这种情况下,形式“/data/gitinit.png”的绝对路径是理想的,但这是另一个问题。我正在研究的是一个处理工具。该工具在运行时从Processing内部调用。我跑的时候
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种不同的方法(其中一种方式出现在Processing Tool Template repo的自述文件中),尽管它们基本上都做同样的事情。同样,最终目标是在按钮上加载图标。
// 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” “,但我该怎么做?
此外,这个假设是否正确?
我知道这个问题真的很长,对不起,我只是想把我所有的实验都提到现在。此外,我知道很多东西都是随机的,特别是尝试了foldername,/,\和filename的不同组合,并且还将gitinit.png放在每个可能的文件夹中,我也为此道歉。只是我想在发布之前试试我能做的一切:)
谢谢!
答案 0 :(得分:1)
您需要使用
getResource("/data/toolbar/logos/gitnit.png")
从data
一直到图像的完整路径。我不习惯使用Eclispe而不习惯将{em>"数据" dir放在src
的同一级别上。在Netbeans中,我有 in src
,但看起来Eclipse会照顾你,看着你的图像。