Java keyListener multi touche

Résolu/Fermé
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 - Modifié par irongege le 29/03/2013 à 19:54
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 - 30 mars 2013 à 20:08
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:
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:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
29 mars 2013 à 18:55
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 ;-)

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);
    }
}
1
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
29 mars 2013 à 19:22
Bonsoir KX, et merci pourta réponse rapide et tes remarquables interventions

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.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019 > walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015
Modifié par KX le 29/03/2013 à 19:40
Mon point de vue, c'est que le clavier ne traite pas les touches individuellement, il traite des combinaisons de touches. Donc l'appuie sur un trop grand nombre de touches est bloqué avant même d'arriver à l'ordinateur. Rajouter des Threads ne changera rien.

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...
0
Pulsar360 Messages postés 113 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
29 mars 2013 à 19:40
Bonjour,

Alors là bravo !!
On à enfin là solution et sans Thread en plus, moi qui ne les aime pas.

Merci KX.
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73 > walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015
29 mars 2013 à 19:42
c soit vraiment etrange, ou je ne suis pas au courant de la concurrence des touches.
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.
0
Pulsar360 Messages postés 113 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10 > walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015
29 mars 2013 à 19:47
Essaye avec le nez =p
0