I'm having trouble with displaying my image file, src/happyFace.gif, in my Java GUI. The goal is to display an image of a smiling face that seems to glide across the program window at an angle, bouncing off of the window edges.
I think my problem is with the image variable (type ImageIcon) in src/ReboundPanel.java, because the ImageIcon class might not be compatible with future swing releases (according to Oracle's documentation: https://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html). If this is true, I think the ImageIcon class might not be able to be supported by the swing library. I don't know how to check my swing library for this.
src/happyFace.gif
My Output Window
src/Rebound.java:
//********************************************************************
// Rebound.java Java Foundations
//********************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Rebound{
//-----------------------------------------------------------------
// Displays the main frame of the program.
//-----------------------------------------------------------------
public static void main (String[] args){
JFrame frame = new JFrame ("Rebound");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ReboundPanel());
frame.pack();
frame.setVisible(true);
}
}
src/ReboundPanel.java:
//********************************************************************
// ReboundPanel.java Java Foundations
//
// Represents the primary panel for the Rebound program.
//********************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ReboundPanel extends JPanel{
private final int WIDTH = 300, HEIGHT = 100;
private final int DELAY = 20, IMAGE_SIZE = 35;
private ImageIcon image;
private Timer timer;
private int x, y, moveX, moveY;
//-----------------------------------------------------------------
// Sets up the panel, including the timer for the animation.
//-----------------------------------------------------------------
public ReboundPanel(){
timer = new Timer(DELAY, new ReboundListener());
image = new ImageIcon ("happyFace.gif");
x = 0;
y = 40;
moveX = moveY = 3;
setPreferredSize (new Dimension(WIDTH, HEIGHT));
setBackground (Color.black);
timer.start();
}
//-----------------------------------------------------------------
// Draws the image in the current location.
//-----------------------------------------------------------------
public void paintComponent (Graphics page){
super.paintComponent (page);
image.paintIcon (this, page, x, y);
}
//*****************************************************************
// Represents the action listener for the timer.
//*****************************************************************
private class ReboundListener implements ActionListener{
//-----------------------------------------------------------------
// Updates the position of the image and possibly the direction
// of movement whenever the timer fires an action event.
//-----------------------------------------------------------------
public void actionPerformed (ActionEvent event){
x += moveX;
y += moveY;
if (x <= 0 || x >= WIDTH-IMAGE_SIZE)
moveX = moveX * -1;
if (y <= 0 || y >= HEIGHT-IMAGE_SIZE)
moveY = moveY * -1;
repaint();
}
}
}
In ReboundPanel
class,
change image = new ImageIcon("happyFace.gif");
to image = new ImageIcon("src/happyFace.gif");
Note that this kind of solution should only be used for testing purposes. As stated in Andrew Thompson's comment, the correct way to store and load the image is using an embedded resource.