2016-02-17 3 views
0

Je développe un jeu vidéo basé sur Java Swing. J'ai un problème avec la détection des frappes - les touches 'A' (déplacer vers la gauche) et 'D' (se déplacer vers la droite), où il semble presque qu'elles ne tirent pas (mais arrive rarement). Presque comme s'ils étaient devenus non enregistrés. Maintenant, j'ai des fichiers journaux d'installation pour capturer les événements du clavier, et de nouveau l'un des keyHandlers à un moment donné ne se déclenche pas. Maintenant, quand cela se produit, si je clique dans l'écran principal du jeu avec ma souris, le keyHandler qui s'est perdu d'une manière ou d'une autre semble fonctionner à nouveau. Presque comme si le "Focus" avait été transféré par inadvertance à un autre widget dans le jeu.Java Swing Key Handlers ne fonctionne pas sporadiquement

Voici le code pour configurer les Plans d'action:

topStatusPanel.getInputMap().put(KeyStroke.getKeyStroke("pressed A"), 
      "aCharKeyPressed"); 
    topStatusPanel.getActionMap().put("aCharKeyPressed", aKeyActionPressed); 


    topStatusPanel.getInputMap().put(KeyStroke.getKeyStroke("released A"), 
      "aCharKeyReleased"); 
    topStatusPanel.getActionMap().put("aCharKeyReleased", aKeyActionReleased); 



    topStatusPanel.getInputMap().put(KeyStroke.getKeyStroke("pressed D"), 
      "dCharKeyPressed"); 
    topStatusPanel.getActionMap().put("dCharKeyPressed", dKeyActionPressed); 

    topStatusPanel.getInputMap().put(KeyStroke.getKeyStroke("released D"), 
      "dCharKeyReleased"); 
    topStatusPanel.getActionMap().put("dCharKeyReleased", dKeyActionReleased); 

    MoveSubLeftActionStart aKeyActionPressed= new MoveSubLeftActionStart(); 
    MoveSubLeftActionStop aKeyActionReleased= new MoveSubLeftActionStop(); 
    MoveSubRightActionStart dKeyActionPressed= newMoveSubRightActionStart(); 
    MoveSubRightActionStop dKeyActionReleased= new MoveSubRightActionStop(); 

apprécierions vraiment des idées à ce sujet. Existe-t-il un moyen de forcer le focus sur un widget spécifique - devrais-je alors pour chaque autre widget dans le jeu de le mettre à "unfocusable"? Cela pourrait-il être le problème? Appréciez toute aide ici.

+2

Pour une meilleure aide plus tôt, un poster [MCVE] ou [Short, autoportantes correcte Exemple] (http://www.sscce.org/). –

+0

s'il vous plaît lire mon commentaire dans la réponse par Jochen Bedersdorfer – mKorbel

Répondre

0

Voici un traitement approfondi sur la gestion de la mise au point et la gestion des événements au clavier. Si votre JPanel contient d'autres composants, ils peuvent obtenir le focus et ne pas propager les événements clés dans la chaîne de composants.

http://docs.oracle.com/javase/6/docs/api/java/awt/doc-files/FocusSpec.html#RequestingFocus

+0

Focus est paramètre paramétrable dans KeyBindings, cette déclaration manquant dans le code OPs, c'est peut-être raison pour – mKorbel

+0

@ mKorbel - J'ai essayé votre suggestion, et utilisé le paramètre: WHEN_ANCESTOR_OF_FOCUSED_COMPONENT pour l'appel getInputMap. Cela n'a pas fonctionné - j'ai toujours les mêmes problèmes de perdre sporadiquement des événements de clavier. Et pour une raison quelconque, cela ne se produit que lorsque l'objet que je déplace se trouve à l'extrême gauche ou à l'extrême droite de l'écran et finit par se coincer là. J'ai les raccourcis clavier liés au topStatusPanel du jeu. Vous vous demandez si peut-être essayer de se lier peut-être au jFrame lui-même ou à un panneau de niveau racine. Voudrais vraiment comprendre ce qui se passe ici. – user1104028

+0

@ user1104028 aucune idée sans un SSCCE/MCVE, court, runnable, compilable avec une valeur codée en dur pour l'interface graphique dans les variables locales, il y a des limitations pour plus de deux modificateurs sont pressés en même temps, il me manque un autre ... – mKorbel