Beginner001
Beginner001

Reputation: 45

Making an image show up in Java

I've been struggling to get an image to show up for some time now. Ive read a few different things, and all of them seem to have different ways of showing images. Can someone tell me what I'm doing wrong? I'm trying to make a program that uses 2 classes to make a picture show up in a frame. I guess what I don't understand still is what a Graphics object is, what a Graphics2D object is and how its different, and what method from what class do I call in order to make an image show up. Here is my code:

public class Smiley {

private BufferedImage smileyFace;
private Graphics2D renderWindow;
private Dimension smileyPosition;
private File smileyFile;

public Smiley() {

    try{
    smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png");
    smileyFace = ImageIO.read(smileyFile);
    } 
    catch (Exception e){
        System.out.println("There was an error finding or reading the file \" smiley.png.\"");
    }

    MainScreen.graphicPane.drawImage(smileyFace,50,50, null);
}

and the second class:

public class MainScreen extends JFrame{

public static MainScreen ms;
public static Graphics2D graphicPane;

public static void main (String[] args){
    MainScreen ms = new MainScreen();
    Smiley newSmiley = new Smiley();
}

public MainScreen(){
    super("Main Screen Window");
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setVisible(true);
    this.setSize(500,800);
    this.getContentPane().setBackground(Color.black);
    graphicPane = (Graphics2D) this.getContentPane().getGraphics();
}

}

the program compiles with no errors and nothing is reported back to me about not finding the file.

Upvotes: 2

Views: 2991

Answers (3)

Paul Samsotha
Paul Samsotha

Reputation: 209112

Your going to need some sore of paint method. For that you will require a Component to paint on. You need to learn a GUI framework, like Swing. There are clear compoents you can paint on like a JPanel. With that panel you need to override its paintComponent method.

The Graphcics object is what the component uses to actually paint the graphic onto the component.

The Graphics2D object just extends the capabilities of the Graphics object.

You should take a look at the Swing tuorial and the **Graphics toturial

To get your program running though you would do something like this

public class DrawPanel extends JPanel {
    BufferedImage smileyFace;

    public DrawPanel() {
        try{
            smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png");
            smileyFace = ImageIO.read(smileyFile);
        } 
        catch (Exception e){
            System.out.println("There was an error finding or reading the file \" smiley.png.\"");
        }
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(smileyFace,50,50, this);
    }

    @Override 
    public Dimension getPreferredSize(){
        return new Dimension(500, 500);
    }
}

Then you can instantiate that panel in another class, adding it to a JFrame to run it

public class Main {
    public static void main(String[] args) {
        SwingUtiliites.invokeLater(new Runnable(){
            public void run() {
                JFrame frame  = new JFrame();
                frame.add(new DrawPanel());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

Upvotes: 3

alex2410
alex2410

Reputation: 10994

You draw image in wrong way.

For using drawImage() you need to use that in paintComponent() method of JComponent(for example JPanel), examine next code:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.beans.Transient;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example extends JFrame {


    public Example() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Smiley());
        frame.pack();
        frame.setVisible(true);
    }

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

    class Smiley extends JPanel{

        private BufferedImage smileyFace;

        Smiley(){
            try {
                File smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png");
                smileyFace = ImageIO.read(smileyFile);
            } catch (Exception e) {
                System.out
                        .println("There was an error finding or reading the file \" smiley.png.\"");
            }

        }

        @Override
        @Transient
        public Dimension getPreferredSize() {
            return new Dimension(smileyFace.getWidth(),smileyFace.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(smileyFace, 0,0, this);
        }

    }
}

or you can add your image to JLabel and that do all for you, change Smile class like next:

class Smiley extends JPanel{

    Smiley(){
        ImageIcon icon = new ImageIcon("C:\\Users\\MyName\\Desktop\\smiley.png");
        JLabel l = new JLabel(icon);
        add(l);

    }

}

ALso read more about customPaintings.

Upvotes: 2

jzd
jzd

Reputation: 23639

You are calling this in your constructor for your Smiley class.

 MainScreen.graphicPane.drawImage(smileyFace,50,50, null);

If you are going to paint the image yourself you need to override paintComponent() in a component that gets added to your main screen.

Or just add the image to a JLabel that you added to the main screen.

Upvotes: 2

Related Questions