Why Are My Images Not Loading in Java Swing?

  • Context: Java 
  • Thread starter Thread starter UltimateSomni
  • Start date Start date
  • Tags Tags
    Java Pictures
Click For Summary

Discussion Overview

The discussion revolves around a Java Swing programming issue where images are not loading, leading to a NullPointerException. Participants explore potential reasons for the error, focusing on file paths and image resource loading within the context of a graphical user interface application.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Homework-related

Main Points Raised

  • One participant reports a NullPointerException when trying to create ImageIcon instances with URLs, suggesting that the images are not found.
  • Another participant proposes that the images should be placed in the same directory from which the program is run to resolve the issue.
  • A suggestion is made to use commented-out constructors for ImageIcon that take file names as strings instead of URLs, indicating this might be a simpler solution.
  • Participants discuss the importance of printing the paths where the program is looking for images to diagnose the issue further.
  • There is a recommendation to adjust the order of method calls in the constructor to avoid potential problems, although it is noted that it does not break the current implementation.
  • Some participants emphasize that the core issue is likely due to the images not being in the expected class directory.

Areas of Agreement / Disagreement

Participants generally agree that the images not being found is the primary issue, but there are differing opinions on the best approach to resolve it, particularly regarding the use of URLs versus file names.

Contextual Notes

There are unresolved assumptions about the directory structure and how resources are being accessed, which may affect the loading of images.

UltimateSomni
Messages
62
Reaction score
0
The error: "Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(ImageIcon.java:167)
at Buttons.<init>(Windows.java:12)
at Buttons.main(Windows.java:38)
Java Result: 1"

The Windows.java code:
_______________________________________

import javax.swing.*;

class Buttons extends JFrame
{
JPanel pnl = new JPanel();

ClassLoader ldr = this.getClass().getClassLoader();

java.net.URL tickURL = ldr.getResource("tick.png");
java.net.URL crossURL = ldr.getResource("cross.png");

ImageIcon tick = new ImageIcon( tickURL ); //LINE 12
ImageIcon cross = new ImageIcon( crossURL );

//ImageIcon tick = new ImageIcon( "tick.png" );
//ImageIcon cross = new ImageIcon( "cross.png" );

JButton btn = new JButton( "Click Me" );
JButton tickBtn = new JButton( tick );
JButton crossBtn = new JButton( "STOP", cross );

public Buttons()
{
super("Swing Window");
setSize( 500,200 );
setDefaultCloseOperation( EXIT_ON_CLOSE );
add(pnl);

pnl.add( btn );
pnl.add( tickBtn );
pnl.add( crossBtn );

setVisible( true );
}

public static void main ( String[] args )
{
Buttons gui = new Buttons();//LINE 38
}
}
_____________________________________________

and line 167 of ImageIcon.java looks like this :


public ImageIcon (URL location) {
this(location, location.toExternalForm()); //line 167
}

_______________________________________________

according to the book this should work
 
Technology news on Phys.org
Hi UltimateSomni! :smile:

It means that the program can't find the .png images.

Put tick.png and cross.png into the directory where you run your program and you should be fine.
 
You should use the commented out ImageIcon constructors that you created instead of the the 5 lines of code where you're trying to pass java.net.URL instances into ImageIcon.
Code:
ImageIcon tick = new ImageIcon( "tick.png" );
ImageIcon cross = new ImageIcon( "cross.png" );

If you're not sure where the program is trying to find your images, use this after your super() call:
Code:
System.out.println("tick: " + tick);
System.out.println("cross : " + cross);

That will print out the complete path where the program is looking for the images. If your images aren't in the directory where the program is looking, Java will just create an empty image which is why you won't see anything.

Finally, you should put the add(pnl); call after you add all of the buttons to the pnl object. It doesn't break in this case but it could cause problems.
 
Last edited:
Code:
//ImageIcon tick = new ImageIcon( "tick.png" );
//ImageIcon cross = new ImageIcon( "cross.png" );

erasing that "//" maybe going to solve your problem .
 
kevinfrankly said:
Code:
//ImageIcon tick = new ImageIcon( "tick.png" );
//ImageIcon cross = new ImageIcon( "cross.png" );

erasing that "//" maybe going to solve your problem .
If he does that without commenting out the other pair of ImageIcon instances, he will have more problems.
 
I like Serena said:
Hi UltimateSomni! :smile:

It means that the program can't find the .png images.

Put tick.png and cross.png into the directory where you run your program and you should be fine.
This works
 
Borg said:
If he does that without commenting out the other pair of ImageIcon instances, he will have more problems.

wow, thanks for your correction . so the only problem is because the image (.png) isn't in the class directory, isn't it ?
 

Similar threads

  • · Replies 14 ·
Replies
14
Views
6K
  • · Replies 4 ·
Replies
4
Views
5K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 14 ·
Replies
14
Views
4K
  • · Replies 15 ·
Replies
15
Views
4K