IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

[KeyListener] Ecouter la frappe de plus de deux touches.


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 34
    Par défaut [KeyListener] Ecouter la frappe de plus de deux touches.
    Bonjour.
    J'ai un petit soucis avec mes évènements claviers.
    J'ai créé un écouteur qui fonctionne parfaitement lorsque j'appuie sur une touche (A par exemple) et sur deux touches (A+B) par exemple mais par contre, keyPressed n'est pas déclenché si je fais A + B +C.
    J'appuie sur A et je reste appuyé, je presse B en maintenant A et enfin je presse C en maintenant A et B appuyées.
    KeyPressed est bien déclenchée pour A et pour B mais pas pour C. Comment faire pour pouvoir intercepter la frappe de 3 touches simultanées.
    Je suis sous Ubuntu 7.10.
    Je me demande si cela n'est pas une contrainte de l'OS ou de mon clavier (USB d'ailleurs).
    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 34
    Par défaut
    Je pense avoir trouvé une solution.
    Elle ne passe pas par un écouteur de clavier mais par une surcharge de la méthode "processKeyEvent" dans un JPanel par exemple.
    Voilà un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void processKeyEvent(KeyEvent e) {        
            if (e.getID() == KeyEvent.KEY_PRESSED)
            System.out.println("Pressed = " + e.getKeyChar());
            else
            if (e.getID() == KeyEvent.KEY_RELEASED)
            System.out.println("Released = " + e.getKeyChar());
     
    }
    De plus cette méthode a un deuxième avantage. Lorsque l'on laisse une touche appuyée, "processKeyEvent" n'est exécutée qu'une seule fois. Il n'y a pas d'auto repeat comme avec la méthode keyPressed d'un KeyListener.
    Cela peut être utilise dans certaine situation.
    Je vais approfondir mes tests et je donnerai mes conclusions plus tard.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Mobaladje Voir le message
    De plus cette méthode a un deuxième avantage. Lorsque l'on laisse une touche appuyée, "processKeyEvent" n'est exécutée qu'une seule fois. Il n'y a pas d'auto repeat comme avec la méthode keyPressed d'un KeyListener.
    Dans ce cas pourquoi ne pas utiliser les méthode keyTyped() et keyReleased() du KeyListener ?

    a++

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 34
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,



    Dans ce cas pourquoi ne pas utiliser les méthode keyTyped() et keyReleased() du KeyListener ?

    a++
    J'avoue que je ne comprends pas la question.
    Un "bug" connu sous Linux, est que lorsque l'on reste appuyé sur une touche cela déclenche en boucle les méthodes keyPressed, keyTyped ET keyReleased. Ce qui rend difficile la détection d'un véritable keyReleased après un auto repeat.
    La surchage de processkeyEvent semble éviter ce problème.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mobaladje Voir le message
    J'avoue que je ne comprends pas la question.
    Je me suis trompé je voulais dire keyPressed() et keyReleased() pour déterminer quand un bouton est appuyé et relaché...


    Citation Envoyé par Mobaladje Voir le message
    Un "bug" connu sous Linux, est que lorsque l'on reste appuyé sur une touche cela déclenche en boucle les méthodes keyPressed, keyTyped ET keyReleased. Ce qui rend difficile la détection d'un véritable keyReleased après un auto repeat.
    La surchage de processkeyEvent semble éviter ce problème.
    Et je ne connaissait pas ce problème...


    Mais je ne comprend pas pourquoi la redéfinition de processKeyEvent() corrige le problème puisque cette dernière se contente d'appeler les méthodes des listeners...


    Au passage je te conseillerais de plutôt redéfinir processComponentKeyEvent() afin d'éviter de casser le mécanisme des listeners sur ton composant

    a++

    PS : Un peu de vocabulaire : la "surcharge de méthode" consiste à ajouter une méthode avec le même nom mais des paramètres différents... Il n'y a donc aucun lien avec une méthode de la classe parente !
    Dans ce cas précis tu fais une redéfinition de méthode

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 34
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Je me suis trompé je voulais dire keyPressed() et keyReleased() pour déterminer quand un bouton est appuyé et relaché...



    Et je ne connaissait pas ce problème...


    Mais je ne comprend pas pourquoi la redéfinition de processKeyEvent() corrige le problème puisque cette dernière se contente d'appeler les méthodes des listeners...


    Au passage je te conseillerais de plutôt redéfinir processComponentKeyEvent() afin d'éviter de casser le mécanisme des listeners sur ton composant

    a++

    PS : Un peu de vocabulaire : la "surcharge de méthode" consiste à ajouter une méthode avec le même nom mais des paramètres différents... Il n'y a donc aucun lien avec une méthode de la classe parente !
    Dans ce cas précis tu fais une redéfinition de méthode
    La rédéfinition de processKeyEvent corrige le problème car elle ne déclenche pas d'auto repeat. Si je reste appuyé sur A, "processKeyEvent" n'est déclenchée qu'une seule fois. Et cela sans déclencher "processKeyEvent" avec un event ayant un ID correspondant à un keyReleased. Il me suffit de déporter mes appels dans la méthode "processKeyEvent" et de les retirer des méthodes "keyPressed" et "keyReleased".
    Merci pour l'info sur processComponentKeyEvent(). Cela ne m'est utile dans ce cas précis mais j'essaierais de ne pas l'oublier pour une autre fois.

Discussions similaires

  1. [plotyy] Afficher plus de deux courbes
    Par Newenda dans le forum MATLAB
    Réponses: 4
    Dernier message: 27/04/2009, 11h03
  2. Réponses: 9
    Dernier message: 03/02/2007, 14h58
  3. Plus de deux listes déroulantes liées
    Par Mateache dans le forum ASP
    Réponses: 2
    Dernier message: 23/08/2006, 12h00
  4. Réponses: 23
    Dernier message: 23/01/2006, 21h31
  5. Réponses: 3
    Dernier message: 13/11/2005, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo