Search code examples
javaswingintellij-ideaimageicon

Cant get ImageIcon to display - swing


public class GUI
{
    JFrame frame;
    JPanel squares[][];


    /* Constructor credited to stackoverflow user ranzy
        http://stackoverflow.com/questions/2535417/chess-board-in-java */
    public GUI()
    {
        frame = new JFrame("Chess");
        squares = new JPanel[8][8];
        frame.setSize(500, 500);
        frame.setLayout(new GridLayout(8, 8));
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                squares[i][j] = new JPanel();

                if ((i + j) % 2 == 0) {
                    squares[i][j].setBackground(Color.white);
                } else {
                    squares[i][j].setBackground(Color.orange);
                }
                frame.add(squares[i][j]);
            }
        }

        ImageIcon pawnW = new ImageIcon(getClass().getResource("/images/pawnW.png"));
        ImageIcon knightW = new ImageIcon("images/knightW.png");
        ImageIcon bishopW = new ImageIcon("/images/bishopW.png");
        ImageIcon rookW = new ImageIcon("/images/rookW.png");
        ImageIcon queenW = new ImageIcon("/images/queenW.png");
        ImageIcon kingW = new ImageIcon("/images/kingW.png");

        ImageIcon pawnB = new ImageIcon("/images/pawnB.png");
        ImageIcon knightB = new ImageIcon("/images/knightB.png");
        ImageIcon bishopB = new ImageIcon("/images/bishopB.png");
        ImageIcon rookB = new ImageIcon("/images/rookB.png");
        ImageIcon queenB = new ImageIcon("/images/queenB.png");
        ImageIcon kingB = new ImageIcon("/images/kingB.png");

        squares[0][0].add(new JLabel(rookW));
        squares[1][0].add(new JLabel(knightW));
        squares[2][0].add(new JLabel(bishopW));
        squares[3][0].add(new JLabel(queenW));
        squares[4][0].add(new JLabel(kingW));
        squares[5][0].add(new JLabel(bishopW));
        squares[6][0].add(new JLabel(knightW));
        squares[7][0].add(new JLabel(rookW));

        squares[0][7].add(new JLabel(rookB));
        squares[1][7].add(new JLabel(knightB));
        squares[2][7].add(new JLabel(bishopB));
        squares[3][7].add(new JLabel(queenB));
        squares[4][7].add(new JLabel(kingB));
        squares[5][7].add(new JLabel(bishopB));
        squares[6][7].add(new JLabel(knightB));
        squares[7][7].add(new JLabel(rookB));

        for (int i = 0; i < 8; i++)
        {
            squares[i][1].add(new JLabel (pawnW));
            squares[i][6].add(new JLabel (pawnB));
        }

    }

}

I'm not able to get the icons to display. I've looked through multiple tutorials on this as well as looked at others' code.

enter image description here

I tried three different ways:

ImageIcon pawnW = new ImageIcon(getClass().getResource("/images/pawnW.png"));
ImageIcon knightW = new ImageIcon("images/knightW.png");
ImageIcon bishopW = new ImageIcon("/images/bishopW.png");

Solution

  • Before anything, as a side note, setVisible should be the last thing you do after adding all components

    Also check the below

    Works fine for me using getClass().getResource()

     String path = "/images/stackoverflow2.png";
    
     ImageIcon pawnW = new ImageIcon(getClass().getResource(path));
    

    Check all below, then when correct it, build it, then run it.

    enter image description here

    File Structure after Build. Images should get copied to class path

    enter image description here

    enter image description here

    import java.awt.Color;
    import java.awt.GridLayout;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class GUI
    {
        JFrame frame;
        JPanel squares[][];
    
        public GUI()
        {
            frame = new JFrame("Chess");
            squares = new JPanel[8][8];
            frame.setSize(500, 500);
            frame.setLayout(new GridLayout(8, 8));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    squares[i][j] = new JPanel();
    
                    if ((i + j) % 2 == 0) {
                        squares[i][j].setBackground(Color.white);
                    } else {
                        squares[i][j].setBackground(Color.orange);
                    }
                    frame.add(squares[i][j]);
                }
            }
    
            String path = "/images/stackoverflow2.png";
    
            ImageIcon pawnW = new ImageIcon(getClass().getResource(path));
            ImageIcon knightW = new ImageIcon(getClass().getResource(path));
            ImageIcon bishopW = new ImageIcon(getClass().getResource(path));
            ImageIcon rookW = new ImageIcon(getClass().getResource(path));
            ImageIcon queenW = new ImageIcon(getClass().getResource(path));
            ImageIcon kingW = new ImageIcon(getClass().getResource(path));
    
            ImageIcon pawnB = new ImageIcon(getClass().getResource(path));
            ImageIcon knightB = new ImageIcon(getClass().getResource(path));
            ImageIcon bishopB = new ImageIcon(getClass().getResource(path));
            ImageIcon rookB = new ImageIcon(getClass().getResource(path));
            ImageIcon queenB = new ImageIcon(getClass().getResource(path));
            ImageIcon kingB = new ImageIcon(getClass().getResource(path));
    
            squares[0][0].add(new JLabel(rookW));
            squares[1][0].add(new JLabel(knightW));
            squares[2][0].add(new JLabel(bishopW));
            squares[3][0].add(new JLabel(queenW));
            squares[4][0].add(new JLabel(kingW));
            squares[5][0].add(new JLabel(bishopW));
            squares[6][0].add(new JLabel(knightW));
            squares[7][0].add(new JLabel(rookW));
    
            squares[0][7].add(new JLabel(rookB));
            squares[1][7].add(new JLabel(knightB));
            squares[2][7].add(new JLabel(bishopB));
            squares[3][7].add(new JLabel(queenB));
            squares[4][7].add(new JLabel(kingB));
            squares[5][7].add(new JLabel(bishopB));
            squares[6][7].add(new JLabel(knightB));
            squares[7][7].add(new JLabel(rookB));
    
            for (int i = 0; i < 8; i++)
            {
                squares[i][4].add(new JLabel (pawnW));
                squares[i][6].add(new JLabel (pawnB));
            }
    
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    new GUI();
                }
            });
        }
    }