4 votes

Définir et récupérer un objet dans un JLabel avec un MouseListener

J'ai un JLabel avec un MouseListener

label.addMouseListener( new ClickController() );

où les actions à effectuer sont dans

class ClickController{
...
public void mouseClicked(MouseEvent me) {
        // retrieve Label object
}

Existe-t-il un moyen d'associer un objet à la JLabel pour que je puisse y accéder à partir de la méthode mouseClicked ?

Edit :

Pour donner un exemple plus illustratif, ce que j'essaie de faire ici est de définir JLabels comme une représentation graphique de cartes à jouer. L'étiquette est censée être la représentation d'un objet Carte qui contient toutes les données réelles. Je veux donc associer cet objet Card à l'étiquette JLabel.

Solution :

Comme le suggère "Hovercraft Full Of Eels", me.getSource() est la voie à suivre. Dans mon cas particulier, ce serait :

Card card = new Card();
label.putClientProperty("anythingiwant", card);
label.addMouseListener( new ClickController() );

et récupérer l'objet Carte de l'écouteur :

public void mouseClicked(MouseEvent me) {
   JLabel label = (JLabel) me.getSource();
   Card card = (Card) label.getClientProperty("anythingiwant");
   // do anything with card
}

6voto

Hovercraft Full Of Eels Points 161146

Vous pouvez obtenir l'objet cliqué facilement en appelant getSource() sur l'événement MouseEvent renvoyé par toutes les méthodes MouseListener et MouseAdapter. Si le MouseListener a été ajouté à plusieurs composants, le composant cliqué sera renvoyé de cette façon.

c'est-à-dire,

public void mousePressed(MouseEvent mEvt) {
   // if you're sure it is a JLabel!
   JLabel labelClicked = (JLabel) mEvt.getSource();
}

note : Je préfère généralement utiliser le mousePressed() méthode sur mouseClicked() car il est moins "capricieux" et enregistrera un appui même si la souris bouge après l'appui et avant le relâchement.

2voto

JB Nizet Points 250258

Vous pourriez simplement utiliser un Map<JLabel, Card> (si vous voulez obtenir une carte à partir d'une étiquette), ou un Map<Card, JLabel> (si vous voulez obtenir une étiquette à partir d'une carte).

1voto

Joe Points 354

Bien sûr, une façon simple de procéder serait de créer un constructeur dans le fichier ClickController qui a accueilli un JLabel . Vous pourriez alors accéder à ce JLabel à l'intérieur de l'objet. Par exemple :

class ClickController{
    private JLabel label;
    public ClickController(JLabel label){
        this.label = label;
    }    ...
    public void mouseClicked(MouseEvent me) {
        label.getText()//Or whatever you want
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X