Listener sur un bouton

Résolu
Vlatiss Messages postés 62 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 22 septembre 2009 - 20 juil. 2009 à 10:52
Vlatiss Messages postés 62 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 22 septembre 2009 - 20 juil. 2009 à 15:00
Bonjour,
J'ai un soucis avec un listener sur un bouton.
Pour simplifier mon problème:j'ai 3 vues, nous les appellerons vue A, vue B et vue C.
Dans la vue A j'ai un bouton de style push et une table. Dans les deux autres j'ai des arbres.

Dans la vue A j'ai un listener sur la table qui permet de mettre à jour les arbres des vues B et C. Mon problème et que je souhaiterais, lorsque j'appuie sur le bouton de la vue A, agir sur les vues B et C (afin de vider mes arbres).
Voici comment je procédais pour placer le listener sur la table de la vue A.

table.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {

...

setSelection(new StructuredSelection(Object));

}
});


getSite().setSelectionProvider(this);


Si quelqu'un pouvait m'aiguiller un peu ça serait sympa. je ne vois pas comment ajouter un nouveau listener.

5 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
20 juil. 2009 à 11:05
Salut,

Tu l'ajoutes de la même façon (qui n'est pas optimale que ce soit niveau lisibilité ou niveau performance, soit dit en passant, mais le soucis n'est pas là), je ne vois pas où est le problème...

tonBouton.AddActionListener(new ActionListener{...});
______________________________________
DarK Sidious
3
Vlatiss Messages postés 62 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 22 septembre 2009
20 juil. 2009 à 11:11
C'est ce que j'ai essayer de faire:

searchButton.addSelectionListener(new SelectionAdapter() {

@Override
public void widgetSelected(SelectionEvent e) {

boolean erase=true;		
setSelection(new StructuredSelection(erase));
erase = false;
}
});


Mais comment le récupérer dans l'autre vue? Si je procéde la même manière que celui qui est sur la table ça n'aboutit à rien.
Qu'entends tu par "optimal". Quelle façon serait plus adapter pour ajouter les listeners?
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
20 juil. 2009 à 11:30
Salut,

Et bien si tu appelle le setSelection comme cà, ca s'applique à la classe courante. Si tu veux l'appliquer à une autre classe, il faut utiliser l'instance de la classe en question. Soit dans ton cas, l'appliquer sur les instances des classes B et C.


Par optimal voilà ca que je voulais dire :
1/ Pour des raisons de performances : tu créer une nouvelle instance de listener pour chaque contrôle ! Donc si tu as 100 contrôles par exemple, tu auras 100 listeners de crée, avec autant de listener en écoute en même temps...

Pour que ca soit plus optimal tu fais implémenter ta classe contenant le contrôle du listener en question :
class Fenetre implements ActionListener {
  protected static final String NOM_BOUTON = "bouton";
  JButton button;
  public Fenetre() {
    button = new JButton();
    button.setName(NOM_BOUTON);
    button.addActionListener(this); // ainsi qu'une seule instance du listener
  }

  public void actionPerformed(ActionEvent event) {
    if (NOM_BOUTON.equals(event.getSource().getName()) {
      // traitement pour le click du bouton
    }
  }
}


C'est déjà plus simple à lire et surtout, plus optimisé.

2/ Pour des raisons de lisibilités, je te conseille d'utiliser une classe interne pour cà : comme cà tu découpe ton code en une partie pour la création de l'interface, et une partie pour la gestion des événements :
class Fenetre {
  protected static final String NOM_BOUTON = "bouton";
  JButton button;

  ActionListener actionListener;

  public Fenetre() {
    actionListener = new BoutonListener();
    // ici le code de création de l'interface
    button = new JButton();
    button.setName(NOM_BOUTON);
    button.addActionListener(actionListener);
  }
  
  // ici les classes pour les traîtements des événements : une seule classe par type de listener bien entendu
  class BoutonListener {
    public void actionPerformed(ActionEvent event) {
      if (NOM_BOUTON.equals(event.getSource().getName()) {
        // traitement pour le click du bouton
      }
    }
  }
}


C'est plus long à taper, je te l'accorde (bien qu'avec un eclipse bien configuré, tu peux tout générer avec 2 raccourcis), mais c'est bien plus lisibles, bien plus maintenables, et bien plus optimisé.
Voir ma source de wordart pour un exemple concret.
______________________________________
DarK Sidious
3
Vlatiss Messages postés 62 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 22 septembre 2009
20 juil. 2009 à 11:38
Merci pour ces explications, je vais me plonger de nouveau dans mon code avec cette aide en plus.
Encore merci.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vlatiss Messages postés 62 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 22 septembre 2009
20 juil. 2009 à 15:00
RESOLU.
Merci Darksidious
3
Rejoignez-nous