Phyremaster
Phyremaster

Reputation: 87

Java - How do I get an image to display?

I have spent a really long time trying to find a way to display an image in a Java program (I'm trying to learn how to make a 2D Java game) an nothing that I've tried works. I'm using Eclipse Mars and the latest of everything else. Here is my code:

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {

    public static void main(String[] args0) {

        JFrame frame = new JFrame();
        ImageIcon image = new ImageIcon("background.bmp");
        JLabel imageLabel = new JLabel(image);
        frame.add(imageLabel);
        frame.setLayout(null);
        imageLabel.setLocation(0, 0);
        imageLabel.setSize(1000, 750);
        imageLabel.setVisible(true);
        frame.setVisible(true);
        frame.setSize(1000, 750);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

Please, just tell me how to correct the code so that the image actually displays. Thank you ahead of time.

(P.S. the "background.bmp" file is in the "default package" if that changes anything)

Upvotes: 1

Views: 4133

Answers (3)

Miozus
Miozus

Reputation: 1

As a beginer, I found that is easy to see the picture you draw:

Source code

public class CheckCodeTest  {

    private int width = 100, height = 50;
    private BufferedImage image = new BufferedImage(width, height,
                                      BufferedImage.TYPE_INT_RGB);

    @Test
    public void drawGraphicsTest() throws IOException {

        Graphics graphics = image.createGraphics();

        // draw an orange rectangle
        graphics.setColor(Color.orange);
        graphics.fillRect(0,0,width,height);

        // layout the picture right now!
        graphics.drawImage(image,0,0,null);
        ImageIO.write(image, "png", new File("checkcode.png"));
    }
}

Output

It produce a picture file under your projects content.

output-picture

Then you can see what change after adding draw code in small window, it is more convenient than closing an jump-out Frame / Label window:

output-picture-in-editor

Upvotes: 0

Eugene
Eugene

Reputation: 11085

The image with .bmp suffix can't be displayed in your code. Try to modify

ImageIcon image = new ImageIcon("background.bmp");

to

ImageIcon image = new ImageIcon("background.png");

and change the image name to background.png.

However, if you just want to use background.bmp, you need to modify your code like this and background image will be displayed.

import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {

    public static void main(String[] args0) {

        try {
            JFrame frame = new JFrame();
            File imageFile = new File("background.bmp");
            Image i = ImageIO.read(imageFile);
            ImageIcon image = new ImageIcon(i);
            JLabel imageLabel = new JLabel(image);
            frame.add(imageLabel);
            frame.setLayout(null);
            imageLabel.setLocation(0, 0);
            imageLabel.setSize(1000, 750);
            imageLabel.setVisible(true);
            frame.setVisible(true);
            frame.setSize(1000, 750);
            frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

Here is the effect with new code: enter image description here

Hope it helps.

BTW, I've put the image at the root directory of the project.

Upvotes: 2

camickr
camickr

Reputation: 324157

Read the section from the Swing tutorial on How to Use Icons. The examples their show you how to load the images as resources. When you use resources the classpath will be searched to find the file.

//frame.setLayout(null);
//imageLabel.setLocation(0, 0);
//imageLabel.setSize(1000, 750);

Don't use a null layout and attempt to set the size/location of the label. Let the layout manager do its job. The label will be the size of the image.

//frame.setSize(1000, 750);
frame.pack();

Don't use frame.setSize(...). Instead you use frame.pack() then the frame will be the size of the image plus the size of the frame borders and title. Let Swing and its layout managers do the work for you.

Upvotes: 1

Related Questions