JComponents not showing up with picture background?

Here first watch this small example, do let me know if you understood what is going on in here. Then only we will go a step further, slowly slowly. Try to go through this example, in which I am showing you how to draw on a JPanel

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class PaintingExample {

    private CustomPanel contentPane;

    private void displayGUI() {
        JFrame frame = new JFrame("Painting Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new CustomPanel();        

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new PaintingExample().displayGUI();
            }
        });
    }
}

class CustomPanel extends JPanel {

    private BufferedImage image;

    public CustomPanel() {
        setOpaque(true);
        setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
        try {
            /*
             * Since Images are Application Resources,
             * it's always best to access them in the
             * form of a URL, instead of File, as you are doing.
             * Uncomment this below line and watch this answer
             * of mine, as to HOW TO ADD IMAGES TO THE PROJECT
             * http://stackoverflow.com/a/9866659/1057230
             * In order to access images with getClass().getResource(path)
             * here your Directory structure has to be like this
             *                 Project
             *                    |
             *         ------------------------
             *         |                      |
             *        bin                    src
             *         |                      |
             *     ---------             .java files             
             *     |       |                   
             *  package   image(folder)
             *  ( or              |
             *   .class        404error.jpg
             *   files, if
             *   no package
             *   exists.)
             */
            //image = ImageIO.read(
            //      getClass().getResource(
            //              "/image/404error.jpg"));
            image = ImageIO.read(new URL(
                        "http://i.imgur.com/8zgHpH8.jpg"));
        } catch(IOException ioe) {
            System.out.println("Unable to fetch image.");
            ioe.printStackTrace();
        }
    }

    /*
     * Make this one customary habbit,
     * of overriding this method, when
     * you extends a JPanel/JComponent,
     * to define it's Preferred Size.
     * Now in this case we want it to be 
     * as big as the Image itself.
     */
    @Override
    public Dimension getPreferredSize() {
        return (new Dimension(image.getWidth(), image.getHeight()));
    }

    /*
     * This is where the actual Painting
     * Code for the JPanel/JComponent
     * goes. Here we will draw the image.
     * Here the first line super.paintComponent(...),
     * means we want the JPanel to be drawn the usual 
     * Java way first (this usually depends on the opaque
     * property of the said JComponent, if it's true, then
     * it becomes the responsibility on the part of the
     * programmer to fill the content area with a fully
     * opaque color. If it is false, then the programmer
     * is free to leave it untouched. So in order to 
     * overcome the hassle assoicated with this contract,
     * super.paintComponent(g) is used, since it adheres
     * to the rules, and performs the same task, depending
     * upon whether the opaque property is true or false),
     * then later on we will add our image to it, by 
     * writing the other line, g.drawImage(...).
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }
}

Compile and Run:

  1. Start command prompt/terminal/cmd. And move to the location referred
    to by the Project folder
  2. Now compile the code by using:

    C:\Project>javac -d bin src\*.java

  3. Now move to bin folder, by issuing command:

    C:\Project>cd bin

  4. Once inside bin folder, issue the following command to run:

    C:\Project\bin>java PaintingExample

Here is the code when using JLabel as the base for the image :

import java.awt.*;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;

public class LabelExample {

    private JPanel contentPane;
    private JLabel imageLabel;

    private void displayGUI() {
        JFrame frame = new JFrame("Label Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBorder(
                BorderFactory.createLineBorder(Color.BLACK, 5));
        //imageLabel = new JLabel(
        //          new ImageIcon(
        //              getClass().getResource(
        //                  "/image/404error.jpg")));
        try {
            imageLabel = new JLabel(new ImageIcon(
                    new URL("http://i.imgur.com/8zgHpH8.jpg")));
        } catch(MalformedURLException mue) {
            System.out.println(
                    "Unable to get Image from"
                        + "the Resource specified.");
            mue.printStackTrace();
        }
        contentPane.add(imageLabel);
        frame.setContentPane(contentPane);  
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LabelExample().displayGUI();
            }
        });
    }
}

Here is the output of both the above codes :

404Error

Leave a Comment