(Solved)I need some help with Loading Images outside Eclipse IDE

Hello everyone! i would like help for a problem that i continuesly have… This is my first Post and sorry if my english or post is not perfect. I was working on a game and everytime i stuck on the same problem. While i try to load images, i succesded inside Eclipse IDE but when i export it i get error. I tryed to make a res folder and add it into my project libraries which used to solve this problem but at the moment again i have issues. I don’t know what to do or how to fix it. Is a bug of Eclipse IDE ? or something i am doing wrong.

My Resources class which i use to load all my images is the following:



public class Resources extends Component {
	private static final long serialVersionUID = -8912492884211057348L;
	public static BufferedImage bullet,craft,emeny,bg1,bg2;

	  public Resources(){
		
			try {
				 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
				 InputStream input = classLoader.getResourceAsStream("bullets.png");
				 
				bullet = ImageIO.read(input);
				
				 input = classLoader.getResourceAsStream("airplane.png");
				craft = ImageIO.read(input);
				
				 input = classLoader.getResourceAsStream("background.png");
				bg1 = ImageIO.read(input);
			
				 input = classLoader.getResourceAsStream("enemy.png");
				emeny = ImageIO.read(input);
			} catch (IOException e) {
			}
		}
	
}


After that in my Main Method which is plane.class where i create a JFRAME for my game and i add a new board() which is where i do everything else. Here is my Main Plane method:


 extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 8957704465368507754L;
	public static final int DISPLAY_HEIGHT = 800;
	public static final int DISPLAY_WIDTH = 600;


	plane() {
	
		super("Plane");// INITIALISE THE JFRAME

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setSize(new Dimension(DISPLAY_HEIGHT, DISPLAY_WIDTH));
		setLocationRelativeTo(null);

		setResizable(false);
		Resources r = new Resources();
		add(new board());
		setVisible(true);
	}

	public static int getDISPLAY_HEIGHT() {
		return DISPLAY_HEIGHT;
	}

	public static int getDISPLAY_WIDTH() {
		return DISPLAY_WIDTH;
	}

	public static void main(String[] args) {
		new plane();
	}

}

I create an Resources object with the name r which loads all the Images. And now about my Board class which the paint method looks solike this



	public void paint(Graphics g) {
		paintComponent(g);
		g.setFont(new Font("Arial", 0, 25));
		g.setColor(new Color(255, 5, 128));

		g.drawImage(Resources.bg1, back1.getX(), back1.getY(), this);
		g.drawImage(Resources.bg1, back2.getX(), back2.getY(), this);

		craft.paint(g);
		for (int i = 0; i < weapon.size(); i++) {
			weapon.get(i).paint(g);
		}
		for (int i = 0; i < 5; i++) {
			enemyarray[i].paint(g);
		}



When i run it though Eclipse IDE works excelent but when i want to create a stand alone .jar it throws me

Exception in thread “main” java…lang.IllegalArgumentException: input == null! to my Resourse Class.

I have continuesly have problems with this issue and sometimes i solve it but always seems to come back. I would like if someone could help me with issue.

In addition , while i was doing some research on how to load and read images i created this class

package com.petrosarts.plane;


import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.net.URL;

import javax.imageio.*;
import javax.swing.*;
 
/**
 * This class demonstrates how to load an Image from an external file
 */
public class LoadImageApp extends Component {
           
	 public static BufferedImage img;
	 public static  ImageIcon image;
    public void paint(Graphics g) {
        g.drawImage(LoadImageApp.img, 0, 0, null);
    }
 
    public LoadImageApp() {
       try {
    	   ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    	   InputStream input = classLoader.getResourceAsStream("strawberry.jpg");
    	
           img = ImageIO.read(input);

       } catch (IOException e) {
       }
 
    }
 
    public Dimension getPreferredSize() {
        if (img == null) {
             return new Dimension(100,100);
        } else {
           return new Dimension(img.getWidth(null), img.getHeight(null));
       }
    }
 
    public static void main(String[] args) {
 
        JFrame f = new JFrame("Load Image Sample");
             
        f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
 
        f.add(new LoadImageApp());
        f.pack();
        f.setVisible(true);
    }
}

which runs perfectly and it works outside IDE which is wierd cause i tryed to do the same technique on mine but didn’t work out.
Thank you in advance for your help.

ok, when you export the .jar, the images should be in same folder than the .jar

Unless it android, if it is, kill me , because i cant run libgdx on it. Except the example project meh.

If it runs in Eclipse I would assume its a problem with how your loading it. Make sure everything is inside of your project. After that make sure those are being exported when you create a runnable jar.

Oh yes, i forgot that Eclipse have that export option.

this is how i load images from a resource folder :


       try {
			URL url = this.getClass().getResource("image.png");
			image = ImageIO.read(url);
		} catch (IOException e) {
			e.printStackTrace();
		}

am not sure if you need a classLoader

good luck

Yes the problem is the way i load images indeed… I created a folder name “Res” and then i load it as Class Folder though Propertise for plane java build path / Libraries.

I used

URL url = this.getClass().getResource("bullets.png");
			   System.out.println(" " + url);

to see what does it point too and its returns me null but if i put /bullets.png intended it point me to the file in my hard drive folder. I am confused :frowning:

Fixed it… finaly… it was a mistake because i misspelled enemy.png its enemy.PNG … Stupit me :slight_smile: thank you everyone for the help to load images i used URL :slight_smile: as alaslipknot said thank you

I hate silly mistakes like that