2017-02-25 2 views
-1

Je crée un jeu d'échecs sur mon temps libre, et après que les utilisateurs effectuent une action (ie déplace un morceau), je mets à jour la fenêtre (JFrame) pour afficher la nouvelle position de la pièce. Cependant, dans ma fonction de mise à jour, j'utilise la fonction add (Component) pour ajouter les JLabels à un JPanel. Par conséquent, à chaque mise à jour, plusieurs JLabels sont ajoutés au composant car la fonction add() empile JLabels.Empêcher JPanel d'ajouter plusieurs fois ImageIcon

BufferedImage img = null; 
    try{ 
     img = ImageIO.read(getClass().getResource(theTiles.get(i).getPiece().getImagePath())); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 
    ImageIcon icon = new ImageIcon(img); 
    JLabel label = new JLabel(); 
    label.setIcon(icon); 

    //Here is where the error is: 
    theTiles.get(i).add(label); 
    label.repaint(); 

    this.window.validate(); 
    this.window.repaint(); 

Parce que cette fonction est appelée chaque fois qu'il ya une mise à jour, « theTiles.get (i) .add (label) » est d'ajouter plusieurs JLabels au JPanel chaque fois qu'il est appelé. Je l'ai essayé de définir un JLabel unique en tant que variable privée de la classe afin qu'il remplace juste que JLabel au lieu d'ajouter plus quand il a besoin de mettre à jour par exemple:

public class TilePanel extends JPanel{ 
    //JLabel variable 
    private JLabel someLabel = new JLabel(); 

    TilePanel(){ 
    //Add the component to the Panel 
     this.add(someLabel); 
    } 

    public Jlabel setLabel(JPanel newLabel){ 
    //setLabel function to use in the "update" function 
     this.someLabel = newLabel 
    } 


... 
//Use setLabel instead of add(Component) 
theTiles.get(i).setLabel(label); 

Cependant, cela ne provoque aucune image apparaisse . Où vais-je mal? (Note: C'est la première fois que je travaille avec des interfaces graphiques)

+0

Vous avez changé la référence (à someLabel), mais l'étiquette d'origine est toujours à l'écran (et je ne sais pas comment cela se compilera), lorsque vous changez l'étiquette, vous devez supprimer l'ancien composant et ajouter le nouveau – MadProgrammer

+1

Vous pouvez également changer le icône du label – MadProgrammer

Répondre

0

Merci à MadProgrammer pour les conseils; voici la solution que j'ai trouvé:

Dans ma fonction de mise à jour, je viens d'appeler:

theTiles.get(i).setImage(); 

et Dans ma classe, je les suivantes:

public class TilePanel extends JPanel{ 
    //A JLabel for each tile 
    private JLabel theLabel = new JLabel(); 

TilePanel(int i, int j){ 
     //constructor add the Label to itself 
     this.add(theLabel); 


//A function to "setIcon" instead of using .add() multiple times 
public void setImage(){ 
    //assign in an icon 
    if (this.pieceAtTile != null){ 
      BufferedImage img = null; 
      try{ 
       img = ImageIO.read(getClass().getResource(this.pieceAtTile.getImagePath())); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 
      ImageIcon icon = new ImageIcon(img); 
      this.theLabel.setIcon(icon); 
     } 
     else{this.theLabel.setIcon(null);} 
    theLabel.repaint(); 
    }