views:

361

answers:

4

I have a folder called Etc which has an image I want to use in another file in the same folder, Example.java. So I have Etc\image.png and Etc\Example.java. I've tried using "Etc/image.png" as the image path, but that didn't work. How should I go about this?

Also, suppose the files were in different packages, how would I do it?

My main .java classes are in a package called Main, for the record.

EDIT:

I used this:

ClassLoader.getSystemClassLoader().getResource("Etc\image.png");

A: 

"that didn't work": could you be more specific? (post the line of code that doesn't work, and the error message / exception that results)

Jason S
+1  A: 

You can use Class.getResource(), which uses the class loader to obtain a URL to the resource. For example:

import java.net.URL;
import javax.swing.ImageIcon;

public class Example {

    public ImageIcon getImage() {
        URL url = Example.class.getResource( "image.png" );
        if( url != null ) {
            return new ImageIcon( url );
        }
        return null; // TODO: Better error handling
    }

}

The important part is Example.class.getResource( "image.png" ) - the image path is specified relative to the named class; in this case, it's in the same directory as the class file. You could also use this line in any other class, leaving the reference to Example.class intact.

Rob
A: 

First things first.

Is Etc a package? In other words at the top of your Example file do you have a

package Etc;

???

Usually package names are lower case, which is why I ask.

Second, although you can use relative paths to access resources, I would recommend always using absolute paths.

So

URL url = Example.class.getResource("/Etc/image.png");

if Etc is a package, otherwise

URL url = Example.class.getResource("/image.png");

if it is not.

MeBigFatGuy
A: 

For that to work, you have to have the directory where Etc is in the classpath. If it is inside the jar, I don't remember if . works as a classpath, if not, add Etc to the classpath, and reference the image without the classpath, or put Etc in a sub directory. and put that sub directory in the class path.

Yishai