2014-09-12 4 views
1

J'ai 20 JLabels et tous doivent changer leur couleur d'arrière-plan lorsque la souris entre et revenir à la couleur d'origine lorsque les souris.Lier un seul événement à tous les JLabels en Java

Dois-je lier individuellement 2 avec tous les JLabel s séparément Event-auditeurs de MouseEntered et MouseExited, ou est-il un travail autour pour que je puisse faire seulement 2 événements de surveillance genre de tous les JLabel s? Comme dans l'image ci-dessous: il y a environ 6 JLabels et je veux que chacun change sa couleur d'arrière-plan chaque fois que la souris entre dans la scène et revienne à la couleur d'origine quand la souris se déconnecte.

enter image description here

Alors, dois-je mettre les écouteurs d'événement individuellement sur tous JLabels, ou il peut y avoir un seul écouteur d'événement pour tous JLabels?

Répondre

2

Vous pouvez enregistrer tous les 20 JLabels avec le même écouteur de souris. Vous feriez quelque chose comme ceci:

MouseListener m = new MouseAdapter() // create our own mouse listener 
{ 
    @Override 
    public void mouseEntered(MouseEvent e) 
    { 
     e.getComponent().setBackground(Color.RED);; // this method changes the colours of all the labels 
    } 
    @Override 
    public void mouseExited(MouseEvent e) 
    { 
     e.getComponent().setBackground(Color.GREEN); // this method changes the colours back to normal 
    } 
}; 
for (JLabel label: labels) // iterate over all the labels 
{ 
    label.addMouseListener(m); // give them all our mouse listener 
} 

Où "étiquettes" est une collection (List, Set, tableau ...) de vos JLabels et changeLabelColours() et changeLabelColoursBack() sont deux méthodes que vous définissez pour change les couleurs.

espérons que cela aide!

EDIT: la lecture de votre question éditée, je pense que je dois souligner que ce code entraînera TOUS étiquettes pour changer de couleur quand TOUT des étiquettes est mouchetés-over. Je pense que c'est ce que tu veux dire.

+0

Cela pourrait être très utile dans un très proche avenir pour moi. Merci! +1 Et si un écouteur de souris légèrement différent était nécessaire pour chaque JLabel? Comment le feriez-vous individuellement? – Joehot200

+0

L'itération montre une erreur. Voudriez-vous regarder cela s'il vous plaît? –

+0

Ok laissez-moi tenter le coup –

0

Vous ne "faites pas d'événements". Vous faites des eventListeners. Et oui, vous pouvez faire seulement 2 écouteurs d'événements et les lier à tous JLabel s. Ou, si vous préférez, vous pouvez étendre Jlabel en MyJlabel, qui a l'écouteur d'événement intégré, et vous sauver de la liaison répétée, si cela vous dérange.

+0

pouvez-vous montrer cela avec un exemple de code? –

+0

@Nekojimi vient de le faire ci-dessus. Sa réponse est meilleure. – bruno

0

Vous pouvez utiliser une référence MouseListener.

Vous devez différencier les sources d'événement en fonction des références ou du nom du composant.

Voici un exemple

final JLabel label1 = new JLabel("label1"); 
label1.setName("label1"); 
final JLabel label2 = new JLabel("label2"); 
label2.setName("label2"); 
final JLabel label3 = new JLabel("label3"); 
label3.setName("label3"); 

MouseListener mouseListener = new MouseAdapter() { 

    @Override 
    public void mouseExited(MouseEvent e) { 
    // you can check references 
    if(e.getSource() == label1) { 
     System.out.println("exited " + label1.getName()); 
    } else if (e.getSource() == label2) { 
     System.out.println("exited " + label2.getName()); 
    } else if (e.getSource() == label3) { 
     System.out.println("exited " + label3.getName()); 
    } 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
    String name = ((JComponent)e.getSource()).getName(); 
    // or you can check name of component 
    switch (name) { 
     case "label1": 
     case "label2": 
     case "label3": 
     System.out.println("entered " + name); 
     break; 
    } 
    } 
}; 
for (JLabel l : Arrays.asList(label1, label2, label3)) { 
    l.addMouseListener(mouseListener); 
} 
0

Notez que les étiquettes doivent être opaque afin de changer leur couleur bg.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 


public class CrazyLabels extends JFrame { 

    public CrazyLabels() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     JPanel content = new JPanel(); 
     add(content); 
     content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));   

     MouseAdapter listener = new MouseAdapter() { 

      @Override 
      public void mouseEntered(MouseEvent e) { 
       JLabel label = (JLabel)e.getSource(); 
       label.setBackground(Color.red); 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
       JLabel label = (JLabel)e.getSource(); 
       label.setBackground(UIManager.getColor("Label.background")); 
      } 

     }; 

     for (int i = 0; i < 5; i++) { 
      JLabel label = new MyLabel(listener); 
      label.setText("---- label ----"); 
      content.add(label); 
     } 

     pack(); 
     setLocationRelativeTo(null); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       new CrazyLabels().setVisible(true); 
      } 
     }); 
    } 

    private static class MyLabel extends JLabel { 
     public MyLabel(MouseListener listener) { 
      setOpaque(true); 
      addMouseListener(listener); 
     } 
    } 
} 

Dans cet exemple, un seul auditeur est utilisé pour appliquer le comportement dans toutes les étiquettes.

Questions connexes