Utiliser correctement les listeners swing

Soyez le premier à donner votre avis sur cette source.

Vue 4 713 fois - Téléchargée 1 247 fois

Description

Beaucoup de codes ou de questions posées sur le forum présentent des listeners swing mal utilisés. Ce tutoriel a pour but de vous apprendre à utiliser efficacement les listenrers.

Source / Exemple :


import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Fenetre extends JFrame {
    
    private static final long serialVersionUID = -2780252426871759949L;
    
    private JButton boutonExemple;
    private JPanel panelGris;
    private JPanel panelBleu;
    
    public Fenetre() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        
        /*
         * Création du bouton
         */
        boutonExemple = new JButton("Afficher");
        
        /*
         * Ajout du listener en implémentant la méthode actionPerformed dans une sous classe
         */
        boutonExemple.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "message");
                
            }
        });
        
        panelBleu = new JPanel();
        panelBleu.setPreferredSize(new Dimension(50, 50));
        panelBleu.setBackground(Color.BLUE);
        
        /*
         * Ajout du listener
         */
        panelBleu.addMouseListener(new ListenerChangementCouleur(panelBleu, Color.BLUE, Color.CYAN));
        
        panelGris = new JPanel();
        panelGris.setPreferredSize(new Dimension(50, 50));
        panelGris.setBackground(Color.DARK_GRAY);
        
        /*
         * Ajout du listener
         */
        panelGris.addMouseListener(new ListenerChangementCouleur(panelGris, Color.DARK_GRAY, Color.LIGHT_GRAY));
        
        add(boutonExemple);
        add(panelBleu);
        add(panelGris);
        setSize(300, 100);
        setLocationRelativeTo(null);
        setVisible(true);
        
    }
    
    public static void main(String[] args) {
        new Fenetre();
    }

}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Utilisateur anonyme -
Bonjour

Il y a une faute de frappe dans la description ("listenrers" au lieu de "listeners"). De plus, ton utilisation des écouteurs pose problème. Pour éviter qu'il ne garde des références sur des objets dont on voudrait bien se débarrasser et pour rendre le code plus facile à adapter (par exemple par héritage), il est recommandé d'éviter de mettre du code dans ses "callbacks", il est préférable d'appeler simplement une méthode de la classe de l'instance à laquelle on abonne un écouteur. Ainsi, il ne garde qu'une référence implicite sur l'instance en question et rien d'autre, cela réduit les risques de fuite mémoire, cela évite également qu'un objet obsolète soit utilisé si l'instance à laquelle on abonne un écouteur mute (par exemple si l'écouteur reprend la valeur d'un champ de l'objet écouté et qu'elle change). En terme d'évolutivité, si tu souhaites modifier le comportement du code appelé par ton écouteur, tu pourras simplement surcharger la méthode de l'instance alors que si tu mets ce code directement dans une méthode de l'écouteur, tu devras aussi désabonner l'écouteur de l'objet écouté et créer un autre écouteur. Je travaille depuis 2007 et je peux te dire qu'on peut perdre beaucoup de temps bêtement à cause de ce genre de choses. Tu peux prendre exemple sur le code généré par Matisse GUI Builder dans Netbeans, il crée des méthodes privées pour chaque méthode implémentant l'interface d'un écouteur. C'est après avoir perdu un temps fou à corriger des fuites mémoire que j'ai fini par comprendre pourquoi il procède ainsi. En fait, je conseille d'utiliser les écouteurs comme de vulgaires pointeurs sur fonctions, ça évite beaucoup d'ennuis.
cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
248 -
Salut et merci pour ton commentaire.

A vrai dire, je n'ai pas tellement compris comment tu préconises de les utiliser. Pourrais tu me donner un exemple stp ?
cs_GodConan
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
9 -
Salut,

En effet, c est la méthode utilisé par beaucoup de générateur de code ;o) ( tu peux surement en voir des exemples dans mes derniers sources avec IHM ) je crois que j'utilise NetBeans ;o)

Pour en revenir au listener ;o), j'évite aussi de faire plusieurs instance du même écouteur, dans ton exemple tu le dois à cause des paramètres ;o), ne pourraient il pas être évité d'ailleurs??
Arf!! non ;o) ce ne serait plus le meme exemple ..;o)

Bonne journée

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.