2017-09-25 11 views
1

J'ai une classe, appelée boardGUI, elle a une liste de 64 labels (comme un échiquier). Chaque étiquette correspond à une tuile spécifique sur le tableau.La propriété de JLabel ne change pas

List<JLabel> labelList = new ArrayList<>(); 

Dans une autre classe, je suis en train de mettre une partie de ces étiquettes méthode opaque, avec setOpaque(true), chaque fois que je clique sur l'une des étiquettes (à l'intérieur) méthode mouseClicked.

JLabel l1 = boardGUI.labelList.get(1); 
l1.setOpaque(true); 

Le problème est que, même si l'étiquette fait référence l1 droit dans labelList (j'ai vérifié avec le débogueur), il n `faire un changement visuel (sur l'interface graphique). Mais, si j'essaie de définir l'opacité des étiquettes dans la classe boardGUI, cela fonctionne.

for (int i=0;i<64;i++) 
    labelList.get(i).setOpaque(true); 

Où le problème peut-il être?

ici est la classe où je suis en train d'appliquer les changements:

public class Controller { 

    private Board board = new Board(); 
    private BoardGUI boardGUI = new BoardGUI(); 


    public Controller() { 
     boardGUI.setVisible(true); 
     boardGUI.addLabelListener(new LabelListener()); 

    } 

    class LabelListener implements MouseListener{ 


     @Override 
     public void mouseClicked(MouseEvent arg0) { 
      JLabel l1 = boardGUI.labelList.get(1); 
      l1.setOpaque(true); 
     } 

classe BoardGUI (il y a plus de code, mais il est pas pertinent):

public class BoardGUI extends JFrame{ 

    List<JLabel> labelList = new ArrayList<>(); 

    public BoardGUI() { 
     createView(); 
    } 

    public void createView() { 
      createLabels(mainPanel);        
     } 
    public void createLabels(JPanel mainPanel) { 
     int startX = 100; 
     int startY = 87; 
     int x = 100; 
     int y = 87; 
     int j = 0; 
     for (int i=0;i<64;i++) { 
      JLabel label = new JLabel(); 
      label.setBounds(x , y , 62, 62); 
      labelList.add(label); 
      mainPanel.add(label); 
      if ((i == 7*(j+1) +j)) { 
       x = startX; 
       y = startY + 62 *(i/7); 
       j=j+1; 
      } 
      else { 
       x = x+62; 
      } 
     } 

    } 
+0

Définissez-vous la couleur d'arrière-plan des étiquettes? – JensS

+0

Comment avez-vous eu l'instance de classe qui contient les étiquettes? Il semble que vous travailliez sur différentes instances de la classe qui contient 64 étiquettes. De plus, votre labelList n'est pas statique, ce qui signifie qu'il peut y avoir plusieurs instances de liste existantes dans la mémoire. –

+0

@NaveedKamran. La classe où j'essaye d'appliquer les changements aux étiquettes est réellement le contrôleur de l'interface graphique. 'BoardGUI boardGUI privé = new BoardGUI();' – Tudor

Répondre

1

Vous devez définir à la fois couleur de fond et opacité; voici un exemple pour montrer comment ceux-ci jouent ensemble:

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new FlowLayout()); 
    frame.getContentPane().setBackground(Color.GREEN); 

    JLabel label1 = new JLabel("label1"); 
    label1.setBackground(Color.RED); 
    label1.setOpaque(false); 
    frame.addMouseListener(new MouseListener() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      label1.setOpaque(!label1.isOpaque()); 
      label1.setBackground(label1.getBackground() == Color.RED ? Color.BLUE : Color.RED); 
     } 
     public void mouseReleased(MouseEvent e) {} 
     public void mousePressed(MouseEvent e) {} 
     public void mouseExited(MouseEvent e) {} 
     public void mouseEntered(MouseEvent e) {} 
    }); 

    frame.add(label1); 
    frame.pack(); 
    frame.setVisible(true); 
} 

L'étiquette est d'abord transparanet, puis devient bleu et opaque et le dos avec tous les MouseClick. Donc, fondamentalement, vous devez définir la couleur de fond avec opaque (la couleur ROUGE est juste pour démontrer qu'il n'est jamais montré que l'étiquette n'est jamais à la fois opaque et rouge).

+0

merci. Encore une question, comment se fait-il que lorsque j'essaie de définir l'opacité dans la classe BoardGUI (où j'ai créé les étiquettes), cela rend les étiquettes opaques, sans définir la couleur de fond? – Tudor

+0

La valeur par défaut de opaque est false, mais selon la documentation de setOpaque, elle est "dépendante de l'apparence" pour la plupart des composants; donc si c'est vrai dans votre application (sans vous l'avoir paramétré), c'est probablement dû à un UIManager. – JensS