Changer d'image au clique

Résolu/Fermé
skflers61 Messages postés 43 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 21 novembre 2014 - 16 nov. 2014 à 11:03
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 16 nov. 2014 à 13:55
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
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
16 nov. 2014 à 13:55
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