OVH Cloud OVH Cloud

Envoi d'info lors d'un clic sur un bouton

8 réponses
Avatar
Linio
Bon je vais essayer de faire clair, mais je suis relativement débutant en
java, et je commence à patauger dans mon propre code...
Voilà je fais un programme avec une Frame Principale sur laquelle je
souhaite créer des boutons créés à partir d'une fonction d'une classe
contenue dans le programme:
Je donne un exemple en gros, ce que j'aimerais c'est que ces boutons créés
par le programme lance une fonction avec comme paramètres la valeur de ce
bouton:

performClic(String nomButton).

Or cette fonction devrait se trouver dans la classe principale de mon
programme mais être appelée par ma classe PowerButton.

Ca donne en gros:

public class PowerButton extends Button implements MouseListener {

public void mousePressed (MouseEvent e){

----> ICI LE PROBLEME...

}

public class CreateurBoutons {

...
/* Fonction qui crée plusieurs boutons empilés dans un vecteur */
Vector generateButtons() { ... }

}


class Mainprog {

CreateurBoutons B = new CreateurBoutons()
Frame FrameProg = new Frame()

...
/* Exemple de récupération d'un bouton */
FrameProg.add (PowerButon)B.generateButtons().get(0);

}


Bon tout ceci n'est pas très clair, mais si quelqu'un a compris même de loin
de quoi je voulais parler, je lui serait reconnaissant d'éclairer ma
lanterne, même si c'est une question réthorique et/ou de débutant qui aurait
du lire les docs avant de venir poster ici, merci.
Si vous voulez plus d'éclaircissements sur un point, je peux essayer de
m'expliquer mieux...

L.

8 réponses

Avatar
Thibaut Desmarest
Linio wrote:
Bon je vais essayer de faire clair, mais je suis relativement débutant en
java, et je commence à patauger dans mon propre code...
Voilà je fais un programme avec une Frame Principale sur laquelle je
souhaite créer des boutons créés à partir d'une fonction d'une classe
contenue dans le programme:
Je donne un exemple en gros, ce que j'aimerais c'est que ces boutons créés
par le programme lance une fonction avec comme paramètres la valeur de ce
bouton:

performClic(String nomButton).

Or cette fonction devrait se trouver dans la classe principale de mon
programme mais être appelée par ma classe PowerButton.

Ca donne en gros:

public class PowerButton extends Button implements MouseListener {

public void mousePressed (MouseEvent e){


e.getSource() //pour récupérer le Button (n'oublie pas de faire un cast)

// Après tu peux utiliser la méthode getLabel pour savoir de quel bouton
// il s'agit, ou alors si ca ne te parait pas assez precis tu fais un

if( ((Button) e.getSource()).equals(MyPowerButton) ) {

}
else if( ((Button) e.getSource()).equals(MyOtherButton) ) {

}
else...


Un dernier point; Es tu sur que c'est bien un évènement souris qu'il est
le plus judicieux d'écouter ici ? De quelle action de quel objet veux tu
exactement lancer la création du bouton ?

}

public class CreateurBoutons {

...
/* Fonction qui crée plusieurs boutons empilés dans un vecteur */
Vector generateButtons() { ... }

}


class Mainprog {

CreateurBoutons B = new CreateurBoutons()
Frame FrameProg = new Frame()

...
/* Exemple de récupération d'un bouton */
FrameProg.add (PowerButon)B.generateButtons().get(0);

}


Bon tout ceci n'est pas très clair, mais si quelqu'un a compris même de loin
de quoi je voulais parler, je lui serait reconnaissant d'éclairer ma
lanterne, même si c'est une question réthorique et/ou de débutant qui aurait
du lire les docs avant de venir poster ici, merci.
Si vous voulez plus d'éclaircissements sur un point, je peux essayer de
m'expliquer mieux...

L.


De rien,

Thibaut

Avatar
Linio
Parfait, impeccable, merci!

Je connaissais pas cette méthode, donc j'étais un peu paumé avec mes objets
à droite à gauche.
Pour ce qui est de l'action que je veux écouter sur le bouton, c'est ben une
action n'importe laquelle mais comme à 99% ce sera un clic souris, et que
c'est le seul truc dans lequel je m'en sors...

L.

"Thibaut Desmarest" a écrit dans le message de news:
cliat1$29o7$
Linio wrote:
Bon je vais essayer de faire clair, mais je suis relativement débutant
en


java, et je commence à patauger dans mon propre code...
Voilà je fais un programme avec une Frame Principale sur laquelle je
souhaite créer des boutons créés à partir d'une fonction d'une classe
contenue dans le programme:
Je donne un exemple en gros, ce que j'aimerais c'est que ces boutons
créés


par le programme lance une fonction avec comme paramètres la valeur de
ce


bouton:

performClic(String nomButton).

Or cette fonction devrait se trouver dans la classe principale de mon
programme mais être appelée par ma classe PowerButton.

Ca donne en gros:

public class PowerButton extends Button implements MouseListener {

public void mousePressed (MouseEvent e){


e.getSource() //pour récupérer le Button (n'oublie pas de faire un cast)

// Après tu peux utiliser la méthode getLabel pour savoir de quel bouton
// il s'agit, ou alors si ca ne te parait pas assez precis tu fais un

if( ((Button) e.getSource()).equals(MyPowerButton) ) {

}
else if( ((Button) e.getSource()).equals(MyOtherButton) ) {

}
else...


Un dernier point; Es tu sur que c'est bien un évènement souris qu'il est
le plus judicieux d'écouter ici ? De quelle action de quel objet veux tu
exactement lancer la création du bouton ?

}

public class CreateurBoutons {

...
/* Fonction qui crée plusieurs boutons empilés dans un vecteur */
Vector generateButtons() { ... }

}


class Mainprog {

CreateurBoutons B = new CreateurBoutons()
Frame FrameProg = new Frame()

...
/* Exemple de récupération d'un bouton */
FrameProg.add (PowerButon)B.generateButtons().get(0);

}


Bon tout ceci n'est pas très clair, mais si quelqu'un a compris même de
loin


de quoi je voulais parler, je lui serait reconnaissant d'éclairer ma
lanterne, même si c'est une question réthorique et/ou de débutant qui
aurait


du lire les docs avant de venir poster ici, merci.
Si vous voulez plus d'éclaircissements sur un point, je peux essayer de
m'expliquer mieux...

L.


De rien,

Thibaut



Avatar
Thibaut Desmarest
Linio wrote:

Parfait, impeccable, merci!

Je connaissais pas cette méthode, donc j'étais un peu paumé avec mes objets
à droite à gauche.
Pour ce qui est de l'action que je veux écouter sur le bouton, c'est ben une
action n'importe laquelle mais comme à 99% ce sera un clic souris, et que
c'est le seul truc dans lequel je m'en sors...

L.


Non non non, il ne faut pas faire comme ça du tout !
Si tu fais comme ça, tu vas écouter les clics "sur" le bouton, mais si
quelqu'un appuie sur entrée ou déclenche le bouton d'une quelconque
manière que ce soit, ton prog ne marchera plus. Ce qu'il faut c'est
écouter le "déclenchement" du bouton : le fait qu'il aie été enfoncé (ce
que l'on fait (en effet) avec un clic de souris par exemple).

Ce qu'il faut faire c'est utiliser un ActionListener.
tu fais :

myButton.setActionCommand("boutonOk");
myButton.addActionListener(myActionListener);

et dans ta classe qui implémente ActionListener (celle dont est
instancié myActionListener) tu mets ton :

public void actionPerformed(ActionEvent e){

if(e.getActionCommand().compareTo("boutonOk") == 0) {

}
else if(e.getActionCommand().compareTo("boutonAnnuler") == 0) {

}
else...

}


C'est la méthode normale d'écoute d'evenements bouton (enfin je pense
:-p, si quelqu'un fait autrement qu'il le dise maintenant ou se taise à
jamais).


Bonne route,


Thibaut

Avatar
Thomas Nguyen
On Tue, 26 Oct 2004 15:34:52 +0200, Thibaut Desmarest wrote:
C'est la méthode normale d'écoute d'evenements bouton (enfin je pense
:-p, si quelqu'un fait autrement qu'il le dise maintenant ou se taise à
jamais).



Je confirme, c'est la manière normale pour écouter les évènements
bouton.

Après, il existe des variantes:
- comme tu le montre avec ActionEvent.getActionCommand()
- directement l'instance de JButton avec ActionEvent.getSource()
- ou avec des adaptateurs différents pour chaque bouton.
Mais c'est tout basé sur des évènement ActionEvent et l'interface
ActionListener.

Pour Linio qui débute, je pense que la solution que tu as indiqué est la
plus simple à comprendre.



Autre détail, pour tester l'égalité de deux chaines de caractères, en
général, on utilise
"boutonOk".equals(e.getActionCommand())
plutôt que
e.getActionCommand().compareTo("boutonAnnuler") == 0

Les deux marchent, mais la première écriture est plus compacte, plus
directe, et ne génère jamais de NullPointerException. ;)

-- Thomas

Avatar
Thibaut Desmarest
Autre détail, pour tester l'égalité de deux chaines de caractères, en
général, on utilise
"boutonOk".equals(e.getActionCommand())
plutôt que
e.getActionCommand().compareTo("boutonAnnuler") == 0

Les deux marchent, mais la première écriture est plus compacte, plus
directe, et ne génère jamais de NullPointerException. ;)

-- Thomas


En effet, mais utiliser la méthode equals pour les chaines de caracteres
n'est pas une bonne habitude à prendre car on perd le sens de "equals" à
mon avis.
Normallement equals permet de tester les adresses mémoire de deux objets
pour savoir si on à affaire au même objet ou non.

Or, ici on teste une chaine de caractere avec une autre chaine que l'on
crée pour l'occasion, ce qui devrait en toute logique renvoyer false
tout le temps.
Je ne sais pas pourquoi celà marche tout de même, et j'irais même
jusqu'à dire que moi d'habitude j'utilise

if( e.getActionCommand() == "boutonOk" )

Ok arrêtez de me jeter des pierres, je sais que c'est moche mais ca
marche aussi alors que ca ne devrait pas non plus !
Cependant comme Linio débute, j'ai préféré lui montrer un compareTo pour
qu'il ne se mélange pas les pédales par la suite.

Voilà, et sinon pour faire un NullPointerException avec le compareTo,
faudrait vraiment le faire exprès ;)


Thibaut

Avatar
Thomas Nguyen
On Wed, 27 Oct 2004 09:55:29 +0200, Thibaut Desmarest wrote:
En effet, mais utiliser la méthode equals pour les chaines de caracteres
n'est pas une bonne habitude à prendre car on perd le sens de "equals" à
mon avis.


Heu .... je deviens con ou tu me dit que equals() ne sert pas à tester
l'égalité?

Normallement equals permet de tester les adresses mémoire de deux objets
pour savoir si on à affaire au même objet ou non.


Pour tester si deux références pointent sur le même objet, on utilise
l'opérateur = Pour tester si deux objets *distincts* ont la même valeur, on utilise
equals().

Dans le cas de la classe String, la méthode equals() fait une comparaison
caractère par caractère.


Or, ici on teste une chaine de caractere avec une autre chaine que l'on
crée pour l'occasion, ce qui devrait en toute logique renvoyer false
tout le temps.


En comparant avec == oui
En comparant avec equals, non

Je ne sais pas pourquoi celà marche tout de même, et j'irais même
jusqu'à dire que moi d'habitude j'utilise

if( e.getActionCommand() == "boutonOk" )


Ca marche uniquement si l'initialisation du bouton et la gestion des
évènements se font dans la même classe.
En effet, le compilateur "factorise" les littéraux qui apparaissent dans
le code. Si la chaine de caractère "boutonOk" apparait plusieurs fois
dans le .java, un seul objet String sera généré dans le .class

Tu te reposes sur une optimisation du compilateur, et tu va avoir une
mauvaise surprise le jour où tu changera de compilo.

Avatar
Thibaut Desmarest
Thomas Nguyen wrote:
On Wed, 27 Oct 2004 09:55:29 +0200, Thibaut Desmarest wrote:

En effet, mais utiliser la méthode equals pour les chaines de caracteres
n'est pas une bonne habitude à prendre car on perd le sens de "equals" à
mon avis.



Heu .... je deviens con ou tu me dit que equals() ne sert pas à tester
l'égalité?


Non je pense plutôt que c'est moi qui n'ai jamais eu de "vrai" cours de
Java et qui ai dû comprendre le aquals comme ça un jour.

Normallement equals permet de tester les adresses mémoire de deux objets
pour savoir si on à affaire au même objet ou non.



Pour tester si deux références pointent sur le même objet, on utilise
l'opérateur = > Pour tester si deux objets *distincts* ont la même valeur, on utilise
equals().

Dans le cas de la classe String, la méthode equals() fait une comparaison
caractère par caractère.


Peut être que la méthode equals() a été surchargée dans la classe
String, mais de base, elle fait un == il me semble et ce serait de là
que viendrait ma confusion ?

Or, ici on teste une chaine de caractere avec une autre chaine que l'on
crée pour l'occasion, ce qui devrait en toute logique renvoyer false
tout le temps.



En comparant avec == oui
En comparant avec equals, non


Je ne sais pas pourquoi celà marche tout de même, et j'irais même
jusqu'à dire que moi d'habitude j'utilise

if( e.getActionCommand() == "boutonOk" )



Ca marche uniquement si l'initialisation du bouton et la gestion des
évènements se font dans la même classe.
En effet, le compilateur "factorise" les littéraux qui apparaissent dans
le code. Si la chaine de caractère "boutonOk" apparait plusieurs fois
dans le .java, un seul objet String sera généré dans le .class

Tu te reposes sur une optimisation du compilateur, et tu va avoir une
mauvaise surprise le jour où tu changera de compilo.


Merci de m'avoir enfin donné la réponse à cette question ! Depuis le
temps que je me demandais pourquoi ça marchait ;)
C'est bon à savoir...

Pour le equals() je pense qu'on a peut être un peu raison tous les deux,
ca doit faire un == de base (d'où ma confusion). Sauf dans la plupart
des classes de Sun ou elle a été surchargée pour faire une vraie
comparaison entre deux objets mémoire distincts...
Donc si j'utilise le equals() avec des classes perso où je n'ai pas
surchargé la méthode ca fait bien l'équivalent d'un == mais en carrément
moins propre...

Dis moi si tu es d'accord avec mes raisonnements, je pense que j'ai du
code à nettoyer ;)

Thibaut


Avatar
Thomas Nguyen
On Thu, 28 Oct 2004 10:01:24 +0200, Thibaut Desmarest wrote:
Peut être que la méthode equals() a été surchargée dans la classe
String, mais de base, elle fait un == il me semble et ce serait de là
que viendrait ma confusion ?


Oui. ( redéfinir, pas surcharger ;) )

La méthode equals de Object fait une comparaison d'identité parce que
c'est la seule chose possible au niveau de Object.

Mais les classes pour lesquelles l'égalité ne se réduit pas à
l'identité doivent redéfinir equals() (et hashCode() aussi, au passage)



Merci de m'avoir enfin donné la réponse à cette question ! Depuis le
temps que je me demandais pourquoi ça marchait ;) C'est bon à
savoir...

Pour le equals() je pense qu'on a peut être un peu raison tous les
deux, ca doit faire un == de base (d'où ma confusion). Sauf dans la
plupart des classes de Sun ou elle a été surchargée pour faire une
vraie comparaison entre deux objets mémoire distincts... Donc si
j'utilise le equals() avec des classes perso où je n'ai pas surchargé
la méthode ca fait bien l'équivalent d'un == mais en carrément moins
propre...

Dis moi si tu es d'accord avec mes raisonnements, je pense que j'ai du
code à nettoyer ;)



Oui, je suis d'accord.

Pour te rassurer, je pense que tous les compilateurs existants et à
venir comportent et comporteront cette "factorisation" des chaines de
caractères, donc c'est peu probable que ton code se mette subitement à
plus marcher.

Il n'en reste pas moins que c'est généralement très déconseillé
d'utiliser == pour comparer des String, parce que c'est généralement pas
la sémantique voulue.