2009-11-15 7 views
13

Donc le problème que je rencontre est un bug qui se produit uniquement sur Linux. J'essaie d'enregistrer mon application swing quand une touche est enfoncée, puis de détecter quand cette touche est relâchée. Maintenant, cela ne devrait pas être en cause parce que KeyListener est censé gérer cela pour moi. Le problème est que lorsque je maintiens la touche enfoncée, je reçois beaucoup d'événements keyPressed()/keyReleased() répétés au lieu de simplement appuyer sur une seule touche(). Est-ce que quelqu'un a une solution ou une solution pour savoir quand une clé est vraiment publiée sur Linux?Comment arrêter les événements keyPressed()/keyReleased() répétés dans Swing

Merci.

Répondre

14

Le problème que j'ai semble être un bug qui se produit uniquement sur Linux

Oui c'est un problème Linux.

Sous Windows, lorsqu'une touche est maintenue enfoncée, vous obtenez plusieurs événements KeyPressed mais seulement un seul événement KeyReleased.

Cette question est posée souvent et je n'ai jamais vu une bonne solution.

Mais je pense que la base d'une solution est d'utiliser un temporisateur. Lorsque la touche est pressée, vous démarrez un minuteur. Lorsque vous obtenez une autre touche, vous redémarrez le minuteur. Donc, tant que l'intervalle de la minuterie est supérieur au taux de répétition du clavier, le minuteur sera réinitialisé en continu quand une touche est maintenue enfoncée. Lorsque les pressions sur les touches cessent d'être générées, le temporisateur se déclenche de sorte que vous supposez que la touche a été relâchée. Cela implique que vous aurez un retard dans le traitement de keyReleased.

+1

Comment obtenir "le taux de répétition du clavier" en Java? C'est un réglage des préférences de l'utilisateur du système d'exploitation, n'est-ce pas? –

2

Cette question est dupliquée here.

Here's a hack implémenté comme AWTEventListener pouvant être installé au démarrage de l'application.

2

Vous pouvez trouver une bonne solution de contournement here.

+0

Le lien est mort :-( – Thomas

+0

+1 Pour un exemple utile et la restauration du lien Merci! –