Help: Java KeyListener en Multi-touche

walidovich85 - 29 mars 2013 à 18:31
 Utilisateur anonyme - 30 mars 2013 à 11:31
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();
}
}


Comme puis je résoudre ce problème?

je vous remercie d'avance chers internautes

being normal is boring, being a geek is interesting

1 réponse

Utilisateur anonyme
30 mars 2013 à 11:31
Bonjour

Vous semblez méconnaître la gestion des événements du clavier en Java. Voici ce qu'on trouve dans la documentation :
there are some cases where the key typed event is not generated until a key is released


Dans votre cas, il se peut tout à fait que les événements "key typed" soient générés après les événements "key released" donc votre HashSet est vide une fois que vous êtes dans la méthode keyTyped(KeyEvent). De plus, en fonction de l'OS (y compris sous Windows) et des réglages, vous pourriez avoir des répétitions, c'est-à-dire plusieurs événements "key pressed" et "key released" en maintenant une même touche. Il faut alors détecter les événements inutiles pour ne pas en tenir compte en regardant quand il a été généré ou en utilisant une bibliothèque tierce qui marque les éléments "inutiles" pour vous. Après, dans certains cas, ces événements peuvent vous servir quand même.

J'utilise NEWT (JOGL 2.0), je n'ai aucun problème avec ça, je n'ai pas besoin de "keyTyped", je sais quels touches sont appuyées à tout moment, je ne m'occupe pas des événements inutiles, je sais que si une touche est pressée mais pas encore relâchée elle est toujours maintenue, rien de bien sorcier. Si vous gérez intelligemment les événements, vous pouvez vous en sortir sans NEWT mais c'est quand même pas trivial.
























T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
Rejoignez-nous