Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Swing JComboBox et ActionEvent ?

4 réponses
Avatar
Vert-Galant
Bonjour.

J'ai une comboBox qui permet de choisir un mot dans une liste, récupérée
dans une table mysql.

problème : la méthode comboBox.getSelectedItem() renvoie deux mots pendant
l'ouverture du programme = un null et un mot vide. qui sont indésirables car
le null fait planter et le vide lance un tri pour rien (et faut attendre).

C'est facile d'exclure le null, mais pas le mot vide "", qui a un sens pour
la suite du programme si c'est voulu.

J'ai trouvé un truc qui marche :
....
private void maComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getModifiers() == 16) {
monMot = (String) maComboBox.getSelectedItem();
//et on passe le mot à la méthode qui l'utilise
}
}

Bon ça marche, mais je ne comprend pas ce que représente les Event.modifiers
ni pourquoi la valeur 16 !laCategorie = (String)
cBoxCategories.getSelectedItem();

J'ai cherché mais n'ai trouvé que des réponses très sibyllines.
Si quelqu'un connait je suis preneur.
--
Yvon
débutant en java qui a commencé à coder il y a longtemps sur des cartes à
trous
http://perso.numericable.fr/vertgalant/

4 réponses

Avatar
Vert-Galant
Vert-Galant wrote:

Bonjour.

J'ai une comboBox qui permet de choisir un mot dans une liste, récupérée
dans une table mysql.

...........



Désolé un bout de ligne s'est accroché à mon texte.
Voilà le texte corrigé :

J'ai une comboBox qui permet de choisir un mot dans une liste, récupérée
dans une table mysql.

problème : la méthode comboBox.getSelectedItem() renvoie deux mots pendant
l'ouverture du programme = un null et un mot vide. qui sont indésirables
car
le null fait planter et le vide lance un tri pour rien (et faut attendre).

C'est facile d'exclure le null, mais pas le mot vide "", qui a un sens pour
la suite du programme si c'est voulu.

J'ai trouvé un truc qui marche :
....
private void maComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getModifiers() == 16) {
monMot = (String) maComboBox.getSelectedItem();
//et on passe le mot à la méthode qui l'utilise
}
}

Bon ça marche, mais je ne comprend pas ce que représente les
Event.modifiers
ni pourquoi la valeur 16 !

J'ai cherché mais n'ai trouvé que des réponses très sibyllines.
Si quelqu'un connait je suis preneur.

--
Yvon
http://perso.numericable.fr/vertgalant/
Avatar
Alain Ketterlin
Vert-Galant writes:

[...]
J'ai trouvé un truc qui marche :
....
private void maComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getModifiers() == 16) {
monMot = (String) maComboBox.getSelectedItem();
//et on passe le mot à la méthode qui l'utilise
}
}

Bon ça marche, mais je ne comprend pas ce que représente les
Event.modifiers ni pourquoi la valeur 16 !



C'est normal, il ne faut surtout pas faire comme ça. Si tu te demandes
pourquoi, sélectionne ton item avec le clavier, et vérifie si " ça
marche" toujours.

J'ai cherché mais n'ai trouvé que des réponses très s ibyllines.
Si quelqu'un connait je suis preneur.



getModifiers() renvoie un masque qui accumule les constantes définies
dans la classe ActionEvent (ALT_MASK, etc). Note qu'aucun de ceux-là n 'a
la valeur 16. Ton code teste donc quelque chose d'autre, qui n'est pas
documenté.

Les détails (et la façon de faire correcte) sont dans
http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html
(et la doc correspondante de l'API).

-- Alain.
Avatar
Vert-Galant
Alain Ketterlin wrote:

Vert-Galant writes:

[...]
J'ai trouvé un truc qui marche :
....
private void maComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getModifiers() == 16) {
monMot = (String) maComboBox.getSelectedItem();
//et on passe le mot à la méthode qui l'utilise
}
}

Bon ça marche, mais je ne comprend pas ce que représente les
Event.modifiers ni pourquoi la valeur 16 !



C'est normal, il ne faut surtout pas faire comme ça. Si tu te demandes
pourquoi, sélectionne ton item avec le clavier, et vérifie si "ça
marche" toujours.



Exact ça ne marche pas au clavier.

J'ai modifié en ne filtrant que les nulls et en traitant ultérieurement le
cas du mot renvoyé vide.

private void maComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
monMot = (String) maComboBox.getSelectedItem();
if (monMot != null) {
on passe le mot à la méthode qui l'utilise
}
}

ça marche à la souris et au clavier, mais avec un interface purement
graphique le clavier ne sert qu'à écrire, et le fonctionnement au clavier
est désagréable.


J'ai cherché mais n'ai trouvé que des réponses très sibyllines.
Si quelqu'un connait je suis preneur.



getModifiers() renvoie un masque qui accumule les constantes définies
dans la classe ActionEvent (ALT_MASK, etc). Note qu'aucun de ceux-là n'a
la valeur 16. Ton code teste donc quelque chose d'autre, qui n'est pas
documenté.



on peut visualiser le 'Modifier' de l'ActionEvent de 2 façons :

Avant modif, marche à la souris uniquement
- par println(evt), ça donne : 'button1'
- par println(evt.getModifiers()) , ça donne 16

Après modif, ça marche avec souris et clavier
- par println(evt), ça donne : ''
- par println(evt.getModifiers()) , ça donne 0


Les détails (et la façon de faire correcte) sont dans
http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html
(et la doc correspondante de l'API).

-- Alain.



Le problème avec NetBeans IDE, c'est celui de tous les IDE : c'est vraiment
très pratique mais le fonctionnement intime des objets proposés est
difficile à cerner quand on en a besoin (pas souvent).
Quand et pourquoi un objet comme JcomboBox envoie t'il un ActionEvent ou un
ItemStateChanged ?
That is the question, mais on arrive à survivre sans le savoir.
--
Yvon
http://perso.numericable.fr/vertgalant/
Avatar
Alain Ketterlin
Vert-Galant writes:

[...]
Exact ça ne marche pas au clavier.

J'ai modifié en ne filtrant que les nulls et en traitant ultéri eurement le
cas du mot renvoyé vide.

private void maComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
monMot = (String) maComboBox.getSelectedItem();
if (monMot != null) {
on passe le mot à la méthode qui l'utilise
}
}



Reste à savoir pourquoi tu reçois des null. Vérifie comment tu remplis
ton modèle.

ça marche à la souris et au clavier, mais avec un interface pur ement
graphique le clavier ne sert qu'à écrire, et le fonctionnement au clavier
est désagréable.



Ca, ce n'est pas toi qui décide, c'est ton utilisateur. Sans parler des
questions d'accessibilité.

on peut visualiser le 'Modifier' de l'ActionEvent de 2 façons :

Avant modif, marche à la souris uniquement
- par println(evt), ça donne : 'button1'
- par println(evt.getModifiers()) , ça donne 16

Après modif, ça marche avec souris et clavier
- par println(evt), ça donne : ''
- par println(evt.getModifiers()) , ça donne 0



La doc de getModifiers() dit : "Returns the modifier keys held down
during this action event." Rien d'autre n'est garanti (et peut changer
d'une version à l'autre).

Le problème avec NetBeans IDE, c'est celui de tous les IDE : c'est v raiment
très pratique mais le fonctionnement intime des objets proposés est
difficile à cerner quand on en a besoin (pas souvent).



Je ne vois pas ce que NetBeans vient faire là-dedans...

Quand et pourquoi un objet comme JcomboBox envoie t'il un ActionEvent
ou un ItemStateChanged ? That is the question, mais on arrive à
survivre sans le savoir.



Pas sûr. Mais si vraiment tu veux savoir, le mieux est de regarder la
documentation. Celle de JComboBox.addActionListener() dit :

"The ActionListener will receive an ActionEvent when a selection has
been made. If the combo box is editable, then an ActionEvent will be
fired when editing has stopped."

Idem pour addItemListener().

-- Alain.