We help IT Professionals succeed at work.

Images in a combo box does not appear; path problem in Java Programming Code

Below is my java code for images to appear within the combo box beside the text.  I put the images inside the same folder but regardless of where I put the image and play around with the path the images still doesn’t appear.  The errors in Eclipse Console – “Couldn't find file: images/Bird.gif” etc.  I would prefer a simpler and short java code with a solution to the path.  What am I doing wrong?  Please help me.
Below is my java code for images to appear within the combo box beside the text.  I put the images inside the same folder but regardless of where I put the image and play around with the path the images still doesn’t appear.  The errors in Eclipse Console – “Couldn't find file: images/Bird.gif” etc.  I would prefer a simpler and short java code with a solution to the path.  What am I doing wrong?  Please help me.

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

/*
 * CustomComboBoxDemo.java uses the following files:
 *   images/Bird.gif
 *   images/Cat.gif
 *   images/Dog.gif
 *   images/Rabbit.gif
 *   images/Pig.gif
 */

public class CustomComboBoxDemo extends JPanel {
    ImageIcon[] images;
    String[] petStrings = {"Bird", "Cat", "Dog", "Rabbit", "Pig"};

    public CustomComboBoxDemo() {
        super(new BorderLayout());

        //Load the pet images and create an array of indexes.
        images = new ImageIcon[petStrings.length];	//array size
        Integer[] intArray = new Integer[petStrings.length];
        for (int i = 0; i < petStrings.length; i++) {
            intArray[i] = new Integer(i);
            images[i] = createImageIcon("images/" + petStrings[i] + ".gif");
            if (images[i] != null) {
                images[i].setDescription(petStrings[i]);
            }
        }

        //Create the combo box.
        JComboBox petList = new JComboBox(intArray);
        ComboBoxRenderer renderer= new ComboBoxRenderer();
        renderer.setPreferredSize(new Dimension(200, 130));
        petList.setRenderer(renderer);
        petList.setMaximumRowCount(3);

        //Lay out the demo.
        add(petList, BorderLayout.PAGE_START);
        setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
    }

    /** Returns an ImageIcon, or null if the path was invalid. */
    protected static ImageIcon createImageIcon(String path) {
    	java.net.URL imgURL = CustomComboBoxDemo.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
                return null;
        }
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);

        //Create and set up the window.
        JFrame frame = new JFrame("CustomComboBoxDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JComponent newContentPane = new CustomComboBoxDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    class ComboBoxRenderer extends JLabel
                           implements ListCellRenderer {
        private Font uhOhFont;

        public ComboBoxRenderer() {
            setOpaque(true);
            setHorizontalAlignment(CENTER);
            setVerticalAlignment(CENTER);
        }

        /*
         * This method finds the image and text corresponding
         * to the selected value and returns the label, set up
         * to display the text and image.
         */
        public Component getListCellRendererComponent(
                                           JList list,
                                           Object value,
                                           int index,
                                           boolean isSelected,
                                           boolean cellHasFocus) {
            //Get the selected index. (The index param isn't
            //always valid, so just use the value.)
            int selectedIndex = ((Integer)value).intValue();

            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            } else {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }

            //Set the icon and text.  If icon was null, say so.
            ImageIcon icon = images[selectedIndex];
            String pet = petStrings[selectedIndex];
            setIcon(icon);
            if (icon != null) {
                setText(pet);
                setFont(list.getFont());
            } else {
                setUhOhText(pet + " (no image available)",
                            list.getFont());
            }

            return this;
        }

        //Set the font and text when no image was found.
        protected void setUhOhText(String uhOhText, Font normalFont) {
            if (uhOhFont == null) { //lazily create this font
                uhOhFont = normalFont.deriveFont(Font.ITALIC);
            }
            setFont(uhOhFont);
            setText(uhOhText);
        }
    }
}

Open in new window

Comment
Watch Question

Awarded 2011
Awarded 2011

Commented:

with this
java.net.URL imgURL = CustomComboBoxDemo.class.getResource(path);

path should be computed from the top of your classpath

say if you have you java classes in the folder:

project/classes

and

path is

resources/image1.png


then your file should be in

project/classes/resources/image1.png






Awarded 2011
Awarded 2011

Commented:
So path  should not be sought from the top project fiolder, but rather from the top folder of your class hierarchy

or from the folder which appears in the classpath

Awarded 2011
Awarded 2011

Commented:

so if your path  is like that:

java.net.URL imgURL = CustomComboBoxDemo.class.getResource("images/Dog.gif");

and your class
CustomComboBoxDemo.class
is in the  

project/classes

folder,

the put your Dog.gif

in the folder

project/classes/images

Check. It should work - I used it many times this way







Author

Commented:
I dont fully follow.  How do I update my code according to your explanation
Awarded 2011
Awarded 2011
Commented:
don't update your code, just craete folder images in the folder where you have your class sitting
and copy your gif files to that folder

Author

Commented:
Thank you very much.  I will try now and report back to you.  However, in the meantime, do you have a simple and shorter code for displaying images in a combobox without any path problems.
Awarded 2011
Awarded 2011

Commented:
these are by no means path problems - this is very convenient way to do that - beacuse then you can package everything in the .jar
and distribute this jar together with the resources - images, sound files, etc.
And the same code will work everywhere
Awarded 2011
Awarded 2011

Commented:
I'm sure you can say
 java.net.URL imgURL = new URL("file://c:/projects/myproject/Dog.gif")
but that would be much les convenient as it will break as soon as you move it to different folder

Author

Commented:
This guy is brilliant in java.  He read and understood the attached code and responded with a solution within 2 minutes.

Author

Commented:
Thanks for your solution it worked.  I graded you as A as you responeded in lightning speed with a solution within 2 minutes.  You really digested that Java code very fast.  Thanks again.

Author

Commented:
thanks very much
Awarded 2011
Awarded 2011

Commented:
You are always welcome.