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   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention   73
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > walidovich_85 Messages postés 608 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   10
 
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   Statut Membre Dernière intervention   73 > walidovich_85 Messages postés 608 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   10 > walidovich_85 Messages postés 608 Date d'inscription   Statut Membre Dernière intervention  
 
Essaye avec le nez =p
0