Listeners et adaptateurs

     

Passez avec le curseur sur cette applet

alt : l'applet n'est pas visible par votre navigateur (dans le menu Outils, Modules complémentaires, activer le plugin Java(TM) Platform SE 6 U32 6.0.320.5 s'il est désactivé)

Nous présentons trois applications qui font la même chose entre elles et approximativement ce que vous pouvez voir avec l'applet ci-dessus : une petite fenêtre apparaît ; lorsque le curseur entre dans cette fenêtre, le fond devient vert ; lorsque le curseur sort de la fenêtre, il devient rouge.

Le premier programme, le plus simple, utilise un MouseListener.

Le second programme utilise un MouseAdapter.

Le troisième programme utilise un MouseAdapter et une classe interne.

Utilisation d'un MouseListener.

La classe Entedu implémente l'interface MouseListener. Or, l'interface MouseListener déclare cinq méthodes :

Cela contraint la classe Entendu, qui implémente l'interface MouseListener, à définir ces cinq méthodes, même celles qui ne nous sont pas utiles. On attribuera un MouseListener à un compsant lorsque des clics sur ce composant, ou bien l'entrée ou la sortie de la souris, doivent être traités.
Signalons qu'il existe aussi l'interface MouseMotionListener pour traiter ce qui concerne les mouvements de la souris sur un compsosant, avec un bouton enfoncé ou non.

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.Dimension;
import java.awt.Color;

public class Entendu extends JPanel implements MouseListener {
public Entendu() {
setPreferredSize(new Dimension(200, 200));
addMouseListener(this);
setBackground(Color.RED);
}
public void mouseEntered(MouseEvent e) {
setBackground(Color.GREEN);
}

public void mouseExited(MouseEvent e) {
setBackground(Color.RED);
}

public void mousePressed(MouseEvent e) {}

public void mouseReleased(MouseEvent e) {}

public void mouseClicked(MouseEvent e) {}
}

class EssaiEntendu {
public static void main(String[] arg) {
JFrame fenetre = new JFrame();
fenetre.setContentPane(new Entendu());

fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenetre.pack();
fenetre.setLocation(300, 300);
fenetre.setVisible(true);
}
}

Utilisation d'un MouseAdapter

La classe java.awt.event.MouseAdapter implémente l'interface MouseListener et en conséquence définit ses cinq méthodes, avec pour chacune un "corps vide". Si une classe étend la classe MouseAdapter, elle possède par héritage des définitions pour les cinq méthodes déclarée dans l'interface MouseListener ; ces méthodes ne faisant rien, il suffit de redéfinir uniquement les méthodes que l'on souhaite utiliser.
Dans la solution présentée ci-dessous, la classe Ecoute joue ce rôle d'adaptateur.
L'avantage d'utiliser la classe MouseAdapter est d'éviter de définir les méthodes qui ne sont pas utilies pour l'application développée ; néanmoins, il n'y a pas d'héritage multiple, une classe qui étend MouseAdapter n'étend pas une autre classe. C'est pour cela qu'il était ici nécesaire de créer une classe telle que la classe Ecoute ci-dessous.

Signalons qu'il y a aussi, entre autres, l'interface Window.Listener (qui déclare sept méthodes) à laquelle correspond la classe WindowAdapter, l'interface MouseMotionListener (qui déclare deux méthodes) à laquelle correspond la classe MouseMotionAdapter, l'interface KeyListener (qui déclare trois méthodes) à laquelle correspond la classe KeyAdapter

import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Dimension;
import java.awt.Color;

class Ecoute extends MouseAdapter {
JPanel panneau;

Ecoute(JPanel panneau) {
this.panneau = panneau;
}

public void mouseEntered(MouseEvent e) {
panneau.setBackground(Color.GREEN);
}

public void mouseExited(MouseEvent e) {
panneau.setBackground(Color.RED);
}
}

public class EntenduBis extends JPanel {
public EntenduBis() {
setPreferredSize(new Dimension(200, 200));
addMouseListener(new Ecoute(this));
setBackground(Color.RED);
}
}

class EssaiEntenduBis {
public static void main(String[] arg) {
JFrame fenetre = new JFrame();
fenetre.setContentPane(new EntenduBis());

fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenetre.pack();
fenetre.setLocation(300, 300);
fenetre.setVisible(true);
}
}

Utilisation d'un MouseAdapter et d'une classe interne

Cette solution ressemble à la précédente, mais l'adaptateur est définit dans une classe interne et anonyme.
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Color;


public class EntenduTer extends JPanel {
public EntenduTer() {
setPreferredSize(new Dimension(200, 200));
addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
setBackground(Color.GREEN);
}

public void mouseExited(MouseEvent e) {
setBackground(Color.RED);
}
});
setBackground(Color.RED);
}
}

class EssaiEntenduTer {
public static void main(String[] arg) {
JFrame fenetre = new JFrame();
fenetre.setContentPane(new EntenduTer());

fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenetre.pack();
fenetre.setLocation(300, 300);
fenetre.setVisible(true);
}
}
Voici :
addMouseListener(new Ecoute(this)); : on ajoute ainsi un listener pour ce qui concerne les événements de la souris les cliques, la sortie et l'entrée dans le composant).

© Irène Charon - Télécom ParisTech 2011