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
Author by
user2122589
Updated on July 05, 2022Comments
-
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 almost 11 years@user2122589 Like simple solutions :D
-
mKorbel almost 11 years@MadProgrammer please why (I'd also recommend ImageIO over ImageIcon), is there reason, or can you please to share
-
MadProgrammer almost 11 yearsImageIcon 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