Changer ImageIcon à une autre image avec un clic de bouton
Si je veux remplacer une ImageIcon dans un JLabel chaque fois qu'un bouton est pressé. Je l'ai fait, afin que l'image, de l'étiquette, et GridBagConstraints sont publiques. Quand j'essaie de le changer si il ne se passe rien.
Je suis aller sur ce de la mauvaise façon ou?
Merci!
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
}
}
}
OriginalL'auteur user2122589 | 2013-06-07
Vous devez vous connecter pour publier un commentaire.
Plutôt que d'essayer de créer et d'ajouter une nouvelle étiquette à chaque fois, il suffit d'appeler
setIcon
sur l'étiquette elle-mêmeQuelque chose de plus comme...
Découvrez Comment utiliser les etiquettes pour plus de détails.
Je pourrais vous suggérons également de charger les images de la première, de sorte que vous n'avez pas besoin de garder les recharger/création de nouveaux objets sur chaque
actionPerformed
Je recommande aussi
ImageIO
surImageIcon
Comme solutions simples 😀
veuillez expliquer pourquoi (je recommande aussi ImageIO sur ImageIcon), est-il nécessaire, ou pouvez-vous s'il vous plaît de partager
ImageIcon délégués de la acutal de chargement à un thread d'arrière-plan, ce qui signifie que vous ne savez pas vraiment quand l'image chargée (l'API swing est conçu pour cela), il également ne pas jeter toute sorte d'exception si il ne peut pas charger l'image
OriginalL'auteur MadProgrammer