Probleme de sélection dans une JCombobox

Résolu
azerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022 - Modifié le 2 avril 2018 à 01:59
azerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022 - 7 avril 2018 à 01:09
Bonjour,

Lorsque j'utilise la souris pour choisir un item dans la JCombobox pas de problème le code fonctionne.
Par contre, en autocomplétion, l'item apparait mais lorsque j'appuie sur la touche "return" aucun événement ne se produit. Voici le code utilisé :

AVEC LA SOURIS, ci dessous

@Override
  public void actionPerformed(ActionEvent arg0) {
   // TODO Auto-generated method stub
   
   // ***********   1 : demander confirmation si le bon dossier est ouvert
   // ***********   2 : si oui, creer une instance de la class Personne
   // ***********   3 : attribuer les variables à l'instance
   
   
   // 1
   
   JFrame frame = new JFrame("showConfirmDialog");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   ImageIcon img = new ImageIcon("images/dossier.png");
      int option = JOptionPane.showConfirmDialog(frame, "Voulez-vous ouvrir le dossier " + combo1.getSelectedItem().toString(), "Ouvrir un dossier", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,img);
   
      if (option ==  JOptionPane.OK_OPTION) {
       
       //2 
       Personne personne = new Personne("nom","prenom","dossier", "ddnString");
       //3
       personne.dossier = combo1.getSelectedItem().toString();
    
    String decoupe[] = personne.dossier.split(" "); //Tableau contenant nom prenom ddd"
    
    personne.nom = decoupe[0].toString();  // NOM
    personne.prenom = decoupe[1].toString(); // Prenom
    personne.ddnString = decoupe[2].toString(); // ddn
    
     
    }
      
      // si non, focus sur la combobox pour un nouveua choix de dossier
      else {
       
       combo1.requestFocus();
       
      }
   
  }


EN AUTOCOMPLETION:

public class ClavierListener implements KeyListener  {
 
 public void keyPressed (KeyEvent event) {
 }
 
public void keyReleased (KeyEvent event) {
}
 
 public void keyTyped(KeyEvent event )  {
  
  //évenement se declenchant quand la toucher "return" est pressée puis relachée
  JFrame frame3 = new JFrame("showMessageDialog"); 
     frame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     JOptionPane.showMessageDialog(frame3, combo1.getSelectedItem().toString(), "nom du dossier", JOptionPane.INFORMATION_MESSAGE);

  int key = event.getKeyCode();
        if (key == KeyEvent.VK_ENTER) {

puis code identique .....

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
Modifié le 2 avril 2018 à 11:44
Bonjour,

Il faut regarder la documentation pour savoir ce que font les méthodes que tu manipules.
https://docs.oracle.com/javase/10/docs/api/java/awt/event/KeyEvent.html#getKeyCode()

getKeyCode() s'utilise pour récupérer les événements KEY_PRESSED et KEY_RELEASED.
Mais pour KEY_TYPED elle renverra toujours VK_UNDEFINED.

Donc ton code fait ça :

public void keyTyped(KeyEvent event)  {
    int key = event.getKeyCode(); // toujours VK_UNDEFINED
    if (key == KeyEvent.VK_ENTER) { // toujours faux

Remarque : ton commentaire "évenement se declenchant quand la toucher "return" est pressée puis relachée" est faux, le keyTyped intervient à chaque fois qu'un caractère est saisi, par exemple tu peux rester appuyer sur la touche A pour écrire AAA, tu aurais alors 3 appels à keyPressed, 3 appels à keyTyped mais 1 seul appel à keyReleased, dans cet ordre : pressed/typed/pressed/typed/pressed/typed/released
Il peut aussi y avoir une touche pressée puis relâchée, sans qu'aucun caractère ne soit saisi, par exemple avec VK_CONTROL, dans ce cas keyTyped() n'est pas appelée. Sans oublier les combinaisons majuscules, accents, etc.
0
azerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022
2 avril 2018 à 22:30
Bonsoir,

Merci pour les infos. J'ai modifié le code et en fait je ne suis pas sur que mon problème vienne des méthodes du contrôle du clavier. J'ai l'impression qu'il manque un truc ...

J'ai une variable boolean "touche" qui est false.
J'ai une méthode "toucherTapper" qui est appelée dans le constructeur de la class fenêtre, de même que les méthodes du contrôle du clavier.

public void toucherTapper(){
if(touche == true){
// *********** 1 : demander confirmation si le bon dossier est ouvert
// *********** 2 : si oui, creer une instance de la class Personne
// *********** 3 : attribuer les variables à l'instance


public void keyPressed(KeyEvent keyEvent) {  
printIt(keyEvent);
}
public void keyReleased(KeyEvent keyEvent) {
printIt(keyEvent);
}
public void keyTyped(KeyEvent keyEvent) {
//printIt(keyEvent);
}
private void printIt(KeyEvent keyEvent) {
int keyCode = keyEvent.getKeyCode();
if (keyCode == KeyEvent.VK_ENTER) {
touche = true;
}
else {
touche = false;
}
}


J'ai mis le focus sur ma combo.
Quand je lance le début, le breakpoint ne va pas au dela de
if(touche == true)


j'ai l'impression qu'il me manque quelque chose pour la combo soit "écoutée".
0
azerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022
2 avril 2018 à 22:40
Par contre, quand la méthode
combo1.addActionListener(new ItemAction());
est appelée, la méthode "toucheTapper" fonctionne dans ce cas.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127 > azerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022
2 avril 2018 à 22:51
Avec un code partiel c'est difficile de voir tout ce que tu as pu faire, mais si ta méthode toucherTapper() n'est appelée que dans le constructeur ce sera forcément avec sa valeur initiale (touche = false) et changer ultérieurement la valeur de touche ne sera pas rétroactif, il faut rappeler explicitement la méthode toucherTapper() pour pouvoir réévaluer la condition if (touche)

Attention : ton else { touche = false; } risque d'avoir des effets de bords, car si tu appuies sur une autre touche que VK_ENTER la valeur repasse à false, je ne suis pas sûr que ce soit pertinent ici.

Remarque : quel est l'intérêt de cette imbrication de valeur booléenne avec la méthode toucheTaper ? Ne pourrais-tu pas plus simplement appeler ton code directement depuis le keyReleased ?

public void keyPressed(KeyEvent keyEvent) {
}

public void keyTyped(KeyEvent keyEvent) {
}

public void keyReleased(KeyEvent keyEvent) {
    if (keyCode == KeyEvent.VK_ENTER) {
        // ***********   1 : demander confirmation si le bon dossier est ouvert
        // ***********   2 : si oui, creer une instance de la class Personne
        // ***********   3 : attribuer les variables à l'instance
    }
}
Avec le peu de code que j'ai vu, ce que tu as fait ressemble à une bidouille pour contourner un problème qui devrais se résoudre plus facilement que la mécanique que tu as mis en place et qui te pose plus d'ennui maintenant que le problème que tu avais initialement...
0
azerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022
2 avril 2018 à 23:29
tu as complètement raison, je fais de la bidouille ....
Initialement j'avais une class : "ClavierListener"

public class ClavierListener implements KeyListener  {

public void keyPressed (KeyEvent event) {

int key = event.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
// *********** 1 : demander confirmation si le bon dossier est ouvert
// *********** 2 : si oui, creer une instance de la class Personne
// *********** 3 : attribuer les variables à l'instance
JFrame frame = new JFrame("showConfirmDialog"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageIcon img = new ImageIcon("images/dossier.png");
int option = JOptionPane.showConfirmDialog(frame, "Voulez-vous ouvrir le dossier " + combo1.getSelectedItem().toString(), "Ouvrir un dossier : :", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,img);

if (option == JOptionPane.OK_OPTION) {

//2
Personne personne = new Personne("nom","prenom","dossier", "ddnString");
//3
personne.dossier = combo1.getSelectedItem().toString();

etc ...


public void keyReleased (KeyEvent event) {


}

public void keyTyped(KeyEvent event ) {


}


Et dans mon constructeur j'appelle la méthode
combo1.addKeyListener(new ClavierListener());
0
azerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022
2 avril 2018 à 23:36
donc :
1/ quand
public void actionPerformed(ActionEvent arg0) {
" est appelée dans le constructeur (permettant de sélectionner un dossier en choisissant un item avec la souris), le contrôle du clavier fontionne puisque j'ai 2 appels de méthodes dans ce cas :

combo1.addKeyListener(new ClavierListener()); et celle ci-dessous.
Ce qui n'est pas le cas, quand celle ci-dessous n'est pas appelée.

public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

// *********** 1 : demander confirmation si le bon dossier est ouvert
// *********** 2 : si oui, creer une instance de la class Personne
// *********** 3 : attribuer les variables à l'instance


// 1

JFrame frame = new JFrame("showConfirmDialog");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageIcon img = new ImageIcon("images/dossier.png");
int option = JOptionPane.showConfirmDialog(frame, "Voulez-vous ouvrir le dossier " + combo1.getSelectedItem().toString(), "Ouvrir un dossier", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,img);

if (option == JOptionPane.OK_OPTION) {

//2
Personne personne = new Personne("nom","prenom","dossier", "ddnString");
//3
personne.dossier = combo1.getSelectedItem().toString();

String decoupe[] = personne.dossier.split(" "); //Tableau contenant nom prenom ddd"

personne.nom = decoupe[0].toString(); // NOM
personne.prenom = decoupe[1].toString(); // Prenom
personne.ddnString = decoupe[2].toString(); // ddn


}
0
azerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022
7 avril 2018 à 01:09
et j'oubliais il faut appeler la méthode dans le constructeur de la class ;
combo1.addItemListener(this);
0
Rejoignez-nous