Probleme de sélection dans une JCombobox [Résolu]

azerty_qwerty 36 Messages postés vendredi 23 mars 2018Date d'inscription 5 juillet 2018 Dernière intervention - 23 mars 2018 à 14:48 - Dernière réponse : azerty_qwerty 36 Messages postés vendredi 23 mars 2018Date d'inscription 5 juillet 2018 Dernière intervention
- 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 .....
Afficher la suite 

Votre réponse

8 réponses

KX 15616 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 16 juillet 2018 Dernière intervention - Modifié par KX le 2/04/2018 à 11:44
0
Merci
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.
KX 15616 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 16 juillet 2018 Dernière intervention > azerty_qwerty 36 Messages postés vendredi 23 mars 2018Date d'inscription 5 juillet 2018 Dernière intervention - 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...
azerty_qwerty 36 Messages postés vendredi 23 mars 2018Date d'inscription 5 juillet 2018 Dernière intervention - 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.
azerty_qwerty 36 Messages postés vendredi 23 mars 2018Date d'inscription 5 juillet 2018 Dernière intervention - 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());
azerty_qwerty 36 Messages postés vendredi 23 mars 2018Date d'inscription 5 juillet 2018 Dernière intervention - 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


}
azerty_qwerty 36 Messages postés vendredi 23 mars 2018Date d'inscription 5 juillet 2018 Dernière intervention - 7 avril 2018 à 00:45
La solution a été trouvée de cette manière :
1/ J'ai implémenté ma class avec un ItemListener
public class Fenetre1 extends JFrame implements ItemListener {

2/ J'ai supprimé tout le code dans
public void actionPerformed(ActionEvent arg0) {
et l'ai mis dans :
3/
public void itemStateChanged(ItemEvent e) 
{
if(e.getStateChange() == ItemEvent.SELECTED)
{


Ainsi :
1/ la touche entrée permet de sélectionner un item dans la combobox
2/ de meme on peut utiliser la souris
Commenter la réponse de KX
azerty_qwerty 36 Messages postés vendredi 23 mars 2018Date d'inscription 5 juillet 2018 Dernière intervention - 7 avril 2018 à 01:09
0
Merci
et j'oubliais il faut appeler la méthode dans le constructeur de la class ;
combo1.addItemListener(this);
Commenter la réponse de azerty_qwerty

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.