Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t使用getResource()将图像添加到按钮(获取NullPointerException-使用ant构建项目)_Java_Eclipse_Swing_Ant - Fatal编程技术网

Java Can';t使用getResource()将图像添加到按钮(获取NullPointerException-使用ant构建项目)

Java Can';t使用getResource()将图像添加到按钮(获取NullPointerException-使用ant构建项目),java,eclipse,swing,ant,Java,Eclipse,Swing,Ant,我知道这是一个非常常见的错误,我已经阅读了几十篇关于此类错误的帖子,但出于某种原因,似乎什么都没有解决 我的最终目标是从与项目文件夹中的src处于同一级别的特定位置(具体来说,是数据文件夹)读取一个图像,并使用该图像创建一个按钮。然而,我似乎无法读取图像,并不断变为空 此外,我已经尝试了我能想到的所有可能的组合: gitinit.png //gitinit.png \gitinit.png /gitinit.png \gitinit.png data/gitinit.png 数据//gitini

我知道这是一个非常常见的错误,我已经阅读了几十篇关于此类错误的帖子,但出于某种原因,似乎什么都没有解决

我的最终目标是从与项目文件夹中的src处于同一级别的特定位置(具体来说,是数据文件夹)读取一个图像,并使用该图像创建一个按钮。然而,我似乎无法读取图像,并不断变为空

此外,我已经尝试了我能想到的所有可能的组合: gitinit.png
//gitinit.png
\gitinit.png
/gitinit.png
\gitinit.png
data/gitinit.png
数据//gitinit.png
data\gitinit.png
data\gitinit.png

完全是出于毫无意义的沮丧

我正在使用Eclipse。然而,这个项目是用ant构建的

以下是我的项目结构:

可以看到,我在任何地方都添加了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_经理/工具/

此jar文件的内容包括:

这是我使用的代码。我使用了三种不同的方法(其中一种来自回购协议的自述),尽管它们基本上都做相同的事情。同样,最终目的是将图标加载到按钮上

// 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放在每个可能的文件夹中,对此我深表歉意。只是我想在这里发布之前尝试一下我能做的一切:)

谢谢

您需要使用

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

数据到图像的完整路径。我不习惯使用Eclispe,也不习惯在
src
的同一级别上使用“data”dir。在Netbeans中,我在
src
中有它,但它看起来像是Eclipse为您处理的,查看您的图像。

抱歉,但这不起作用:(.gitinit.png既存在于数据文件夹中,也存在于数据/工具栏文件夹中,因此我不认为这会导致问题。此外,Eclipse没有考虑将数据添加到src中,这是我在阅读一些建议的基础上手动完成的,而其他用户在这方面有类似的问题。也许这个问题与我所做的事情更相关“我在构建项目时做错了?您是否尝试将图像放入
数据.工具栏.徽标
软件包中?这样做并使用上面的路径对我总是有效的是的!非常有效。非常感谢:)但是为什么它能工作呢?你需要从类路径的根开始。这是开发环境中的src。所以要嵌入的资源应该在类路径中。然后你只需要使用路径(完全限定的包)