Java keyListener multi touche
Résolu
walidovich_85
Messages postés
608
Date d'inscription
Statut
Membre
Dernière intervention
-
walidovich_85 Messages postés 608 Date d'inscription Statut Membre Dernière intervention -
walidovich_85 Messages postés 608 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je suis un débutant en Java, mais assez passionné pour ne pas avoir la paix sans trouver une solution.
le problème peut etre intutilé "gestion des multi-touches dans l'interface KeyListener". mon programme affiche tt simplement en console, la liste des touches enfoncées.
l'empilement se passe très bien (avec un maximum de 4 a 5 touches), cependant la dépilation dans un sens ne fonctionne pas.
voici mon code:
Comment puis je résoudre ce problème?
je vous remercie d'avance chers internautes.
Being normal is boring... being geek is interesting
je suis un débutant en Java, mais assez passionné pour ne pas avoir la paix sans trouver une solution.
le problème peut etre intutilé "gestion des multi-touches dans l'interface KeyListener". mon programme affiche tt simplement en console, la liste des touches enfoncées.
l'empilement se passe très bien (avec un maximum de 4 a 5 touches), cependant la dépilation dans un sens ne fonctionne pas.
voici mon code:
import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.HashSet; import java.util.Iterator; import javax.swing.JFrame; public class Clavier extends JFrame implements KeyListener { private HashSet<Character> touches = new HashSet<Character>(); public Clavier(){ this.setSize(120, 100); this.addKeyListener(this); this.setLocationRelativeTo(null); this.setVisible(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); } @Override public void keyPressed(KeyEvent arg0) { touches.add(arg0.getKeyChar()); } @Override public void keyReleased(KeyEvent arg0) { touches.remove(arg0.getKeyChar()); if(touches.isEmpty()) System.out.println("Aucune touche n'est enfoncée"); } @Override public void keyTyped(KeyEvent arg0) { String message= new String("Les touches enfoncées sont: "); Iterator iter= touches.iterator(); while(iter.hasNext()){ //if(e.) message+=", "+iter.next(); } System.out.println(message); } public static void main(String[] args) { Clavier clavier= new Clavier(); } }
Comment puis je résoudre ce problème?
je vous remercie d'avance chers internautes.
Being normal is boring... being geek is interesting
A voir également:
- Java keyListener multi touche
- Jeux java itel touche - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Touche remanente windows - Guide
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
1 réponse
Tu peux avoir des problèmes si tu appuies par exemple sur [Shift] puis [C], car car ton code va ajouter le caractère 'C' (en majuscule), mais si tu relèves la touche [Shift] en gardant la touche [C] enfoncée, tu vas ajouter 'c' (minuscule) et tu vas avoir donc 'c' et 'C' en même temps. Quand tu relèveras la touche [C] seul le 'c' va être enlevé, et le 'C' va rester même si aucune touche n'est plus appuyée...
Puisque ce sont les touches qui t'intéresse (et non les caractères qu'ils représentent), je te conseille de considérer les KeyCode ou ExtendedKeyCode plutôt que les getChar, tu n'auras donc plus de problème de ce genre...
PS. J'ai pas mal amélioré le code ;-)
Puisque ce sont les touches qui t'intéresse (et non les caractères qu'ils représentent), je te conseille de considérer les KeyCode ou ExtendedKeyCode plutôt que les getChar, tu n'auras donc plus de problème de ce genre...
PS. J'ai pas mal amélioré le code ;-)
import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.TreeSet; import javax.swing.JFrame; import javax.swing.JLabel; class MultipleListener implements KeyListener { private TreeSet<Integer> set = new TreeSet<Integer>(); private final JLabel label; private final String EMPTY = "Press Any Key"; public MultipleListener() { System.out.println(set); label = new JLabel(EMPTY,JLabel.CENTER); } public JLabel getLabel() { return label; } @Override public void keyPressed(KeyEvent e) { if (set.add(e.getExtendedKeyCode())) { System.out.println(set); label.setText(set.toString()); } } @Override public void keyReleased(KeyEvent e) { if(set.remove(e.getExtendedKeyCode())) { System.out.println(set); if (set.isEmpty()) label.setText(EMPTY); else label.setText(set.toString()); } } @Override public void keyTyped(KeyEvent e) { } } public class Test { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(200,100); MultipleListener listener = new MultipleListener(); frame.add(listener.getLabel()); frame.addKeyListener(listener); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
enfait le code fonctionne bien, et il va me prendre du temps pr bien le comprendre.
je vois encore, la limitation en terme des touches empilées ( ce probleme, je peux le dépasser puisk je vise pas à utiliser des dizaines), mais cette limitation est instable !!!! (dépend de la touche et son ordre d'empilement).
j'était sur le web en recherche, et je rencontre souvent des propositions pour des cas plus ou moins similaire, des propositions d'introduire des threads, pour permettre les multi tache... c quoi votre point de vue pour une solution dans ce sens?
Merci encore.
Personnellement j'arrive à atteindre 10 touches en même temps (mais pas n'importe lesquelles et ça dépend de l'ordre dans lesquels on les appuies). Après c'est surement possible de faire plus, mais je n'ai pas assez de doigts pour essayer.
Il faudrait tester avec deux claviers, cela permettrait surement de générer deux codes claviers en même temps, et donc dépasser le problème matériel, permettant un appui simultané sur un plus grand ensemble de touches en même temps...
Alors là bravo !!
On à enfin là solution et sans Thread en plus, moi qui ne les aime pas.
Merci KX.
l'empilement ne fonctionne pas bien si je combine des touches en vertical. mais en horizontal, c preske nikel. !!!
je sais pas s'il ya des explications pr ça. mais merci pour l'aide.