无法使用getResource()将图像添加到按钮(使用ant获取NullPointerException-构建项目)

时间:2014-03-12 18:54:19

标签: java eclipse swing ant

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

我的最终目标是从特定位置(特定于数据文件夹)中读取与项目文件夹中src相同级别的图像,并创建一个包含该图像的按钮。但是,我似乎无法读取图像,并且一直无效。

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

一切都是出于纯粹,毫无意义的挫折......

我正在使用Eclipse。然而,该项目正在与蚂蚁建立。

这是我项目的结构:

Project Structure

可见,我在任何地方都添加了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 :)。该文件夹包含以下内容:

Folder contents

但是当我跑步时

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

我得到以下输出:

  

文件:/ C:!/Users/MYPC/Documents/Processing/tools/GitManager/tool/GitManager.jar / git_manager /工具/

此jar文件的内容为:

Jar file structure

这是我使用的代码。我已经使用了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放在每个可能的文件夹中,我也为此道歉。只是我想在发布之前试试我能做的一切:)

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要使用

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

data一直到图像的完整路径。我不习惯使用Eclispe而不习惯将{em>"数据" dir放在src的同一级别上。在Netbeans中,我有 in src,但看起来Eclipse会照顾你,看着你的图像。