Changing ImageIcon to another picture with button click

27,229

Rather then trying to create and add a new label each time, simply call setIcon on the label itself

Something more like...

image = new ImageIcon(imageList[1]);
label.setIcon(image);

Check out How to use lables for more details.

I might also suggest that you load the images first, so you don't need to keep reloading them/creating new objects on each actionPerformed

I'd also recommend ImageIO over ImageIcon

Share:
27,229
user2122589
Author by

user2122589

Updated on July 05, 2022

Comments

  • user2122589
    user2122589 almost 2 years

    So I want to replace an ImageIcon in a JLabel every time a button is pressed. I made it so the image, label, and GridBagConstraints are public. When I try to change it though nothing happens.

    Am I going about this the wrong way or?

    Thanks!

    package hi.low;
    
    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    import javax.swing.*;
    import java.util.Random;
    import java.util.ArrayList;
    
    
    public class Card_panel extends JPanel implements ActionListener
    {
       private final int WIDTH = 400, HEIGHT = 200;
    
       private static String[] imageList =  { 
              "images/2h.png", "images/3h.png", "images/4h.png", "images/5h.png", "images/6h.png",
              "images/7h.png", "images/8h.png", "images/9h.png", "images/th.png", "images/jh.png",
              "images/qh.png", "images/kh.png", "images/ah.png", "images/2d.png", "images/3d.png", 
              "images/4d.png", "images/5d.png", "images/6d.png", "images/7d.png", "images/8d.png", 
              "images/9d.png", "images/td.png", "images/jd.png", "images/qd.png", "images/kd.png", 
              "images/ad.png", "images/2c.png", "images/3c.png", "images/4c.png", "images/5c.png",
              "images/6c.png", "images/7c.png", "images/8c.png", "images/9c.png", "images/tc.png",
              "images/jc.png", "images/qc.png", "images/kc.png", "images/ac.png", "images/2s.png",
              "images/3s.png", "images/4s.png", "images/5s.png", "images/6s.png", "images/7s.png",
              "images/8s.png", "images/9s.png", "images/ts.png", "images/js.png", "images/qs.png",
              "images/ks.png", "images/as.png"
       };
       private static int imageNum = -1;
    
       GridBagConstraints gbc = new GridBagConstraints();
       GridBagConstraints c = new GridBagConstraints();
       ImageIcon image;
       JLabel label;
       private static ArrayList<Card> deck;
       private static Card tempCard, currentCard;
    
       public Card_panel()
       {
            deck = new ArrayList();
            char[] suits = {'h', 'd', 'c', 's'};
            char[] values = {'2', '3', '4', '5', '6', '7', '8', '9', 't', 'j', 'q', 'k', 'a'};             
            for(int a = 0; a<suits.length; a++)
            {
                for(int b = 0; b<values.length; b++)
                {
                    tempCard = new Card(suits[a],values[b]);
                    deck.add(tempCard);
                }
            }            
            int rand_num;
            int cards_left = 52;            
            Random generator = new Random( System.currentTimeMillis() );            
            for(int a = 0; a<52; a++)
            {
                rand_num = generator.nextInt(cards_left);
                currentCard = deck.get(rand_num);
                deck.remove(rand_num);
                cards_left -= 1;
            }
            setPreferredSize(new Dimension(WIDTH, HEIGHT));
            setBackground (Color.green.darker().darker());    
            setLayout(new GridBagLayout());
    
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
    
            image = new ImageIcon(imageList[0]);
            label = new JLabel("", image, JLabel.CENTER);
            add( label, gbc );
    
            gbc.gridx = 0;
            gbc.gridy++;
            gbc.gridwidth = 1;
            JButton higher = new JButton("Higher");
            higher.setActionCommand("higher");
            higher.addActionListener (this);
            add( higher, gbc );
    
            gbc.gridx++;
            JButton lower = new JButton("Lower");
            lower.setActionCommand("lower");
            lower.addActionListener (this);
            add( lower, gbc );
       }
    
        @Override
        public void actionPerformed(ActionEvent e)
        {
            String Action;
            Action = e.getActionCommand ();
    
            if (Action.equals ("higher"))
            {
                System.out.println("User chose higher!");
                //function to check if it is right if right go to next card
                image = new ImageIcon(imageList[1]);
                label = new JLabel("", image, JLabel.CENTER);
                add( label, gbc );
            }
    
            if (Action.equals ("lower"))
            {
                System.out.println("User chose lower!");
                //function to check if it is right if right go to next card
            }    
        }        
    }
    
  • MadProgrammer
    MadProgrammer almost 11 years
    @user2122589 Like simple solutions :D
  • mKorbel
    mKorbel almost 11 years
    @MadProgrammer please why (I'd also recommend ImageIO over ImageIcon), is there reason, or can you please to share
  • MadProgrammer
    MadProgrammer almost 11 years
    ImageIcon delegates the acutal loading to a background thread, meaning you don't actually know when the image loaded (the swing API is designed to support this), it also doesn't throw any kind of exception if it can't load the image