IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Bug dans le KeyListener


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 65
    Par défaut Bug dans le KeyListener
    Bonjour,

    Je me casse la tête depuis déjà un bout de temps sur ce problème mais je pense que c'est un problème de java même.
    En fait je suis en train de programmer un jeu qui demande d'enfoncer plusieurs touches du clavier en même temps. Pour ce faire j'utilise le couple keyPressed / keyReleased.
    Le code que j'ai écrit devrait fonctionner mais ce n'est pas tout à fait le cas.
    Donc si j'appuie une touche cela fonctionne. Si j'enfonce deux touches à la fois tout va bien aussi. Cela se corse après car mon jeu doit pouvoir gérer 5 ou 6 touches enfoncées à la fois.

    Pour mon test j'utilise les touches F1 à F5. Et là apparaît le problème la touche F1,F2 et F5 sont bien gérées mais F3 et F4 pas du tout.
    J'ai donc repris le code et tout vérifier mais je ne vois pas ce qui ne va pas. Je décide alors de changer les touches en utilisant AZERT et là les combinaisons de touches acceptées sont différentes. Mais posent toujours problème.
    Je décide donc d encore changer les combinaisons de touches. Au final la combinaison ZERYI fonctionne à merveille et ce sans toucher à une ligne de code.

    Mystère.
    A moins que le KeyListener ne soit pas programmer pour prendre en compte autant de touches enfoncées en même temps. Il y aurait par exemple un tableau des touches et ce tableau ne serait pas balayé complètement car par exemple la deuxième touche enfoncée se trouve à la 10ème position de ce tableau alors que la touche suivante se trouverait en 5 ème place et ne serait plus analysée par l'observateur implémenté dans le KeyListener. Alors que les touches qui se trouvent après le 10 ème emplacement seraient encore analysées.

    Quelqu'un à-t-il une autre idée et surtout une solution?

    Merci d'avance.

    Pour vous aider le programme tourne sur la JVM 1.6.0_07-b6.
    Les tests ont été effectués sous Windows XP et Linux. (même résultat dans les deux cas).
    La programmation est réalisée sous eclipe 3.4

    Voici une version allégée pour pouvoir tester le cas.
    J'ai mis en commentaire les combinaisons de touches qui fonctionnent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JButton;;
     
    public class TestKeys 
    {
    	public static void main(String[] args) 
    	{
    		TestFrame frame = new TestFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setVisible(true);
    	}
    }
     
    class TestFrame extends JFrame
    {
    	public TestFrame()
    	{
    		setSize(640,480);
    		ButtonPanel panel= new ButtonPanel();
    		Container contentPane = getContentPane();
    		contentPane.add(panel);
    	}
    }
     
    class ButtonPanel extends JPanel
    {
    	private JButton bt1,bt2,bt3,bt4,bt5;
    	private int cpt;
     
    	public ButtonPanel()
    	{
    		KeyAction keyAction = new KeyAction();
    		addKeyListener(keyAction);
    		this.initButtons();
    		this.cpt=0;
    	}
     
    	public boolean isFocusTraversable()
    	{
    		return true;
    	}
     
    	private void initButtons()
    	{
    		this.bt1=new JButton("button 1");
    		this.bt2=new JButton("button 2");
    		this.bt3=new JButton("button 3");
    		this.bt4=new JButton("button 4");
    		this.bt5=new JButton("button 5");
    		add(this.bt1);
    		add(this.bt2);
    		add(this.bt3);
    		add(this.bt4);
    		add(this.bt5);
    	}
     
    	private class KeyAction implements KeyListener
    	{
    		public void keyPressed(KeyEvent e)
    		{
    			System.out.println("passage: " + cpt);
    			switch(e.getKeyCode())
    			{
    				case KeyEvent.VK_F1: bt1.setEnabled(false);System.out.println("button 1: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				case KeyEvent.VK_F2: bt2.setEnabled(false);System.out.println("button 2: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				case KeyEvent.VK_F3: bt3.setEnabled(false);System.out.println("button 3: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				case KeyEvent.VK_F4: bt4.setEnabled(false);System.out.println("button 4: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				case KeyEvent.VK_F5: bt5.setEnabled(false);System.out.println("button 5: "+e.getKeyCode()+" "+e.getKeyChar());break;
     
    				// the working case
    				/*
    				case KeyEvent.VK_Z: bt1.setEnabled(false);System.out.println("button 1: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				case KeyEvent.VK_E: bt2.setEnabled(false);System.out.println("button 2: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				case KeyEvent.VK_R: bt3.setEnabled(false);System.out.println("button 3: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				case KeyEvent.VK_Y: bt4.setEnabled(false);System.out.println("button 4: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				case KeyEvent.VK_I: bt5.setEnabled(false);System.out.println("button 5: "+e.getKeyCode()+" "+e.getKeyChar());break;
    				*/
    			}
    			cpt++;
    		}
     
    		public void keyReleased(KeyEvent e)
    		{
    			System.out.println("------------------");
    			switch(e.getKeyCode())
    			{
    				case KeyEvent.VK_F1: bt1.setEnabled(true);break;
    				case KeyEvent.VK_F2: bt2.setEnabled(true);break;
    				case KeyEvent.VK_F3: bt3.setEnabled(true);break;
    				case KeyEvent.VK_F4: bt4.setEnabled(true);break;
    				case KeyEvent.VK_F5: bt5.setEnabled(true);break;
     
    				// the working case
    				/*
    				case KeyEvent.VK_Z: bt1.setEnabled(true);break;
    				case KeyEvent.VK_E: bt2.setEnabled(true);break;
    				case KeyEvent.VK_R: bt3.setEnabled(true);break;
    				case KeyEvent.VK_Y: bt4.setEnabled(true);break;
    				case KeyEvent.VK_I: bt5.setEnabled(true);break; 
    				*/
    			}
    		}
     
    		public void keyTyped(KeyEvent e){}
     
    	}
    }

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    J'ai pas la solution a ton problème, mais voici une classe qui permet d'écouter le clavier partout dans ton appli. Il suffit pour l'activer de faire KeyLogger.install();
    Rien ne t'empêche dans eventDispatched(AWTEvent event) de mettre un code (un thread surement) qui vérifiera les touches pressées avec éventuellement un délai minimum et/ou maximum entre les touches.
    Voila, si ça peut t'aider...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import java.awt.AWTEvent;
    import java.awt.Toolkit;
    import java.awt.event.AWTEventListener;
    import java.awt.event.KeyEvent;
     
     
    public class KeyLogger implements AWTEventListener {
     
    	private static KeyLogger instance;
     
    	private KeyLogger() { }
     
    	public static void install() {
    		if (instance == null) instance = new KeyLogger();
    		getSingletonIntance().start();
    	}
     
    	public static void uninstall() {
    		if (getSingletonIntance() != null) getSingletonIntance().stop();
    		instance = null;
    	}
     
    	private static KeyLogger getSingletonIntance() {
    		return instance;
    	}
     
    	private void start() {
    		Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
    	}
     
    	private void stop() {
    		Toolkit.getDefaultToolkit().removeAWTEventListener(this);
    	}
     
    	@Override
    	public void eventDispatched(AWTEvent event) {
    		KeyEvent e = (KeyEvent)event;
    		System.out.println("eventDispatched: "+e.getKeyCode());
    	}
     
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 65
    Par défaut
    Merci beaucoup pour le code.

    Je vais tester cela.
    En espérant que cela corrigera le problème.

    Le plus bizarre est que j ai essayé sur un pc portable et avec le même code les touches qui ne répondaient pas étaient différentes. Alors que sur trois pc fixe (un sous XP, le second sous Vista et le dernier sous linux) le problème était identique.

Discussions similaires

  1. Bug dans le TCheckListBox ?
    Par Tardiff Jean-François dans le forum Composants VCL
    Réponses: 6
    Dernier message: 04/11/2004, 08h39
  2. Bug dans les expressions régulières ?
    Par SergioF dans le forum Linux
    Réponses: 8
    Dernier message: 12/05/2004, 15h14
  3. [PROPERTIES] Bug dans java.util.Properties ?
    Par mathieu dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 28/04/2004, 15h11
  4. bug dans une base Access
    Par bizouard dans le forum Access
    Réponses: 5
    Dernier message: 29/12/2003, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo