Changer d'image au clique

Résolu
skflers61 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,

Je créer une application Java avec Swing.

J'ai une ImageIcon qui est dans un JLabel, j'aimerais changer d'image quand je clique dessus.

public class VuePoste extends JPanel implements MouseListener{

	private int numeroPoste;
	private JLabel image;

	public VuePoste(int numeroPoste){
		this.numeroPoste = numeroPoste;
		
		image = new JLabel( new ImageIcon( "./ressources/images/PosteVide.png"));
		this.add(image);
		this.setBorder(BorderFactory.createTitledBorder("Poste["+numeroPoste+"]"));
		
		//Grâce à cette instruction, notre objet va s'écouter
	        //Dès qu'un événement de la souris sera intercepté, il en sera averti
		this.addMouseListener(this);
	}
	

	@Override
	public void mouseClicked(MouseEvent arg0) {
		
	}
}


j'ai deux questions:

1) Quelle est la différence entre ActionListerner et MouseListener? Quelle solution choisir dans mon cas?

2) Que faut-il mettre dans mouseClicked pour changer d'image ?

Merci pour vos réponse

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    1) ActionListener est utilisable par un certain nombre de composants, mais pas tous et ne dispose que d'une seule méthode
    actionPerformed
    , l'action à l'origine de l'événement dépendra au composant (voir la documentation pour chacun).
    MouseListener est elle utilisable par tous les composants (car définie dans Component) et dispose de cinq méthodes
    mouseEntered
    ,
    mouseExited
    ,
    mousePressed
    ,
    mouseReleased
    et
    mouseClicked
    , pour gérer tous les événements souris.

    2) Tu peux faire comme ceci :

    private final JLabel image;
    private final Icon image1;
    private final Icon image2;
    private boolean toggleImage;
    
    // ...
    
    image1 = new ImageIcon("image1.png");
    image2 = new ImageIcon("image2.png");
    
    toggleImage = true;
    image = new JLabel(image1);
    
    // ...
    
    @Override
    public void mouseClicked(MouseEvent e)
    {
        toggleImage = !toggleImage;
        image.setIcon(toggleImage ? image1 : image2);
    }

    Remarque : je te conseilles de ne pas mélanger les composants et leurs listeners.
    En gros ce code est à éviter :

    public class VuePoste extends JPanel implements MouseListener
    {
        public VuePoste(int numeroPoste)
        {
            this.addMouseListener(this);
        }
    }

    Il est préférable d'avoir une classe pour le composant, une autre pour le listener :

    public class ToggleImageListener implements MouseListener
    {
        private final JLabel image;
        private final Icon image1;
        private final Icon image2;
        private boolean toggleImage;
        
        public ToggleImageListener(JLabel image, Icon image1, Icon image2)
        {
            this.image = image;
            this.image1 = image1;
            this.image2 = image2;
            toggleImage = true;
            image.setIcon(image1);
        }
    
        @Override
        public void mouseClicked(MouseEvent e)
        {
            toggleImage = !toggleImage;
            image.setIcon(toggleImage ? image1 : image2);
        }
    }
    
    public class VuePoste extends JPanel
    {
        private final JLabel image;
    
        public VuePoste(int numeroPoste)
        {
            image = new JLabel();
            Icon image1 = new ImageIcon("image1.png");
            Icon image2 = new ImageIcon("image2.png");
            addMouseListener(new ToggleImageListener(image, image1, image2));
        }
    }
    0