Question

When running a Java app from eclipse my ImageIcon shows up just fine.

But after creating a jar the path to the image obviously gets screwed up.

Is there a way to extract an image from the jar at runtime so I can then open it up? Or, is there a better way to do this?

I'd like to distribute a single jar file if possible.

Was it helpful?

Solution

To create an ImageIcon from an image file within the same jars your code is loaded:

new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg"))

Class.getResource returns a URL of a resource (or null!). ImageIcon has a constructors that load from a URL.

To construct a URL for a resource in a jar not on your "classpath", see the documentation for java.net.JarURLConnection.

OTHER TIPS

You can try something like:

InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg");

In your JAR file, you might have a directory structure of:

MyJAR.jar
- com (class files in here)
- images
----image.jpg

This is working for me to load and set the content pane background image:

jar (or build path) contains:

 - com
 - img
 ---- bg.png

java contains:

JFrame f = new JFrame("Testing load resource from jar");
try {
    BufferedImage bg = ImageIO.read(getClass().getResource("/img/bg.png"));
    f.setContentPane(new ImagePanel(bg));
} catch (IOException e) {
    e.printStackTrace();
}

Tested and working in both jar and unjarred (is that the technical term) execution.

BTW getClass().getClassLoader().getResourceAsStream("/img/bg.png") - which I tried first - returned me a null InputStream.

In netbeans 8.1 what I've done is to include the folder of icons and other images called Resources inside the src folder in the project file. So whenever i build Jar file the folder is included there.The file tree should be like this:

  • src (Java files in source packges are here)
  • ** PACKAGE YOU NAMED IN PROJECT**

    • file.java
  • Resources

    • image.jpg

The code should be like:

jToggleButton1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource("/resources/image.jpg")));

Load image in from Jar file during run time is the same as loading image when executed from IDE e.g netbeans the difference is that when loading image from JAR file the path must be correct and its case sensitive (very important). This works for me

 image1 = new javax.swing.ImageIcon(getClass().getResource("/Pictures/firstgame/habitat1.jpg"));
        img = image1.getImage().getScaledInstance(lblhabitat1.getWidth(), lblhabitat1.getHeight(), Image.SCALE_SMOOTH);
        lblhabitat1.setIcon(new ImageIcon(img));

if p in "/Pictures/firstgame/habitat1.jpg" is in lower case it wont work. check spaces, cases and spelling

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top