Interface
graphique
PO2
(2014-‐2015)
Chapitre
4
Evénements
Evénements
1. Evénements
2. Traitement
des
événements
3. Evénements
et
écouteurs/Ecouteurs
Evénements
• Au
sens
large,
il
s’agit
d’un
changement
d’état
d’un
objet
dans
une
intervalle
de
temps.
Evénements
• Au
sens
propre
pour
la
programmaLon
graphique,
lorsque
l’uLlisateur
interagit
avec
une
interface
graphique
(en
appuyant
sur
une
touche
du
clavier
ou
un
bouton
de
souris
par
exemple),
un
(ou
plusieurs)
événement
est
généré
.
Traitement
des
événements
• La
programmaLon
événemenLelle
– répond
aux
différents
événements.
– uLlise
un
design
paQern
Observateur/Observé
pour
le
traitement
des
événements.
Observateur/Observé
• Le
design
paQern
Observateur/Observé
définit
une
relaLon
entre
un
objet
et
plusieurs
objets,
de
façon
que,
si
un
objet
change
d’état,
tous
ceux
qui
en
dépendent
en
soient
informés
et
mis
à
jour
automaLquement.
• Ce
design
paQern
conLent
trois
éléments
:
– Observé
(Observable)
• Associé
à
une
liste
des
observateurs
• Produit
des
évènements
• NoLfie
les
observateurs
lorsque
un
évènement
se
produit
– Evénement
(Event)
• Un
changement
d’état
de
l’observé
– Observateur
(Observer)
• Traite
des
événements
venant
de
l’observé
Observateur/Observé
Observateur/Observé
• Avec
GUI
:
– Composant
(Observé)
• Produit
l’événement
(généralement
en
conséquence
d’une
acLon
de
l’uLlisateur).
– Evénement
• ComponentEvent
• ContainerEvent
• MouseEvent
• WindowEvent
• keyEvent
– Ecouteur
(Observateur)
• Traite
l’événement
en
exécutant
une
méthode
en
rapport
avec
la
nature
précise
de
celui-‐ci.
Evénements
et
écouteurs
• Types
d’événements
et
d’écouteurs
– AcLonEvent
/AcLonListener
– MouseEvent
/MouseListener,
MouseMoLonListener
– WindowEvent
/WindowListener
AcLonEvent
et
AcLonListener
• AcLonEvent
correspond
au
déclanchement
de
l'acLon
sur
un
composant
graphique:
– Le
clic
sur
un
bouton
– La
frappe
de
la
touche
«
enter
»
sur
un
TextField
– Etc.
• hQp://docs.oracle.com/javase/1.4.2/docs/api/
java/awt/event/AcLonEvent.html
Classe
interne
:
JetDeEvent1
JetDePanel()
{
• JetListener
sous
forme
de
classe
//
creer
deux
De
interne
deGauche
=
new
DePanel();
deDroit
=
new
DePanel();
• Avantage
:
//
creer
deux
buQons
– accède
facilement
aux
variables
jetBuQon1
=
new
JBuQon("Joueur1");
d'instance
de
la
classe
JetPanel
jetBuQon2
=
new
JBuQon("Joueur2");
– permet
plusieurs
instances
//
créer
une
instance
de
JetListener
JetListener
jetListener
=
new
JetListener();
jetBuQon1.addAcLonListener(jetListener);
jetBuQon2.addAcLonListener(jetListener);
//...
placer
components
this.setLayout(new
BorderLayout());
this.add(jetBuQon1,
BorderLayout.NORTH);
this.add(deGauche
,
BorderLayout.WEST);
this.add(deDroit,
BorderLayout.EAST);
this.add(jetBuQon2,
BorderLayout.SOUTH);
}
Classe
interne
:
JetDeEvent1
//
classe
interne
:
JetListener
• Les
événements
écoutés
sont
de
private
class
JetListener
implements
la
classe
"AcLonEvent"
qui
hérite
AcLonListener
{
de
la
superclasse
Event
public
void
acLonPerformed(AcLonEvent
e)
{
• Méthodes
permeQant
d'obtenir
Object
source
=
e.getSource();
des
informaLons
sur
ce
qui
est
if
(source
==
jetBuQon1)
survenu
deGauche.jet();
– getSource()
donne
le
composant
else
source
de
l'événement
deDroit.jet();
– getAcLonCommand()
donne
le
}
nom
d'acLon,
par
défaut
le
texte
}
du
bouton,
du
menu,
...
}
Classe
interne
anonyme
:
JetDeEvent2
//
creer
deux
buQons
• JetListener
sous
forme
de
classe
jetBuQon1
=
new
JBuQon("Joueur1");
interne
anonyme
jetBuQon2
=
new
JBuQon("Joueur2");
//
classes
interne
anonyme
• Avantage
:
jetBuQon1.addAcLonListener(new
– accède
facilement
aux
variables
AcLonListener()
{
d'instance
de
la
classe
JetDePanel
public
void
acLonPerformed(AcLonEvent
e)
{
deGauche.jet();
• Inconvénient
:
}
– n'a
qu'1
instance
}
– code
moins
lisible
);
jetBuQon2.addAcLonListener(new
AcLonListener()
{
public
void
acLonPerformed(AcLonEvent
e)
{
deDroit.jet();
}
}
);
MouseEvent
et
MouseListener
• La
souris
(le
curseur)
passant
sur
la
surface
graphique
du
composant,
içi
un
JPanel,
provoque
MouseEvent
:
• Le
programme
MouseEvent.java
affiche
ces
événements
en
console
:
! mouseMoved - MouseEvent :
java.awt.event.MouseEvent[MOUSE_MOVED(197,0),button=0,click
Count=0] on javax.swing.JPanel[,
0,0,200x100,layout=java.awt.FlowLayout,
alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,
minimumSize=,
preferredSize=java.awt.Dimension[width=200,height=100]]
mouseExited - MouseEvent :
java.awt.event.MouseEvent[MOUSE_EXITED(197,-
1),button=0,clickCount=0] on javax.swing.JPanel[,
0,0,200x100,layout=java.awt.FlowLayout,
alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,
minimumSize=,
preferredSize=java.awt.Dimension[width=200,height=100]]!
MouseEvent
et
MouseListener
panel.addMouseListener(new MouseListener() {!
! public void mouseClicked(MouseEvent me) {!
! ! System.out.println("mouseClicked - MouseEvent : "+me.toString());!
! }!
! public void mouseEntered(MouseEvent
me)
{
… }!
! public void mouseExited(MouseEvent
me)
{
…}!
! public void mousePressed(MouseEvent
me)
{
… }!!
! public void mouseReleased(MouseEvent
me)
{
…}!
});!
Les
méthodes
des
MouseListener
:
mouseEntered()
:
entrée
de
souris
mouseExited()
:
sorLe
de
souris
mousePressed()
:
bouton
pressé
mouseReleased()
:
bouton
relaché
mouseClicked()
:
bouton
pressé
puis
relaché
dans
sa
zone
graphique
Ces
méthodes
permeQent
de
recevoir
et
d'écouter
les
événements
qui
se
sont
produits
MouseEvent
et
MouseMoLonListener
panel.addMouseMoLonListener(new
MouseMoLonListener()
{
public
void
mouseMoved(MouseEvent
me)
{
… }
public
void
mouseDragged(MouseEvent
me)
{
… }!
});
!
Les
méthodes
desMouseMoLonListener
:
mouseMoved()
:
mouvement
de
souris
mouseDragged()
:
mouvement
de
souris
avec
bouton
enfoncé
L'événement
en
paramètre
donné
des
méthodes
est
celui
qui
s'est
produit
:
il
conLent
des
informaLons
de
ce
qui
s'est
passé.