Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de KeyListener

keyPressed ne se lance pas

Sujet résolu
    22 octobre 2010 à 0:08:35

    Salut tout le monde ! :)

    Je viens cette fois-ci pour un petit problème qui ne devrait pas être trop compliqué à résoudre !
    Pour faire simple, aucune des méthodes de l'interface KeyListener (keyPresserd / keyReleased / keyTyped) ne s'exécute.
    Après quelques rapides recherches, cela vient peut-être du focus mais.. Je n'ai pas eu ce problème auparavant donc je préfère poser la question ici..

    Bref, assez parlé, voilà le code !


    CLASSE Test
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Test extends JFrame
    {
    	public Test()
    	{
    		setTitle("Java - Jeu");
    		setLocation(50, 50);
    		setSize(300, 300);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		add(new Jeu());
    		
    		setVisible(true);
    	}
    	
    	public static void main(String[] args)	{ new Test(); }
    }
    



    CLASSE Jeu
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Jeu extends JPanel implements KeyListener
    {
    	private Image[][] tab;
    	private CaseVide vide;
    	private CaseSol sol;
    	private CaseMario mario;
    
    	public Jeu()
    	{
    		addKeyListener(this);
    		
    		tab = new Image[15][15];
    		vide = new CaseVide();
    		sol = new CaseSol();
    		mario = new CaseMario();
    		
    		initTab();
    	}
    	
    	public void initTab()
    	{
    		for (int i = 0; i < tab.length; i++)
    		{
    			for (int j = 0; j < tab[0].length; j++)
    			{
    				tab[i][j] = vide.getImg();
    				tab[i][tab.length-1] = sol.getImg();
    			}
    		}
    		
    		updateTab();
    	}
    	
    	public void updateTab()
    	{
    		tab[mario.getY()][mario.getX()] = mario.getImg();
    		
    		repaint();
    	}
    	
    	public void paintComponent(Graphics g)
    	{
    		for (int i = 0; i < tab.length; i++)
    			for (int j = 0; j < tab[0].length; j++)
    					g.drawImage(tab[i][j], i*16, j*16, this);
    	}
    	
    	public void keyPressed(KeyEvent e)
    	{
    		if (e.getKeyCode() == KeyEvent.VK_RIGHT)
    			mario.setY(mario.getY() + 1);
    		else if (e.getKeyCode() == KeyEvent.VK_LEFT)
    			mario.setY(mario.getY() - 1);
    		
    		updateTab();
    	}
    	
    	public void keyReleased(KeyEvent e) {}
    	
    	public void keyTyped(KeyEvent e) {}
    }
    


    En espérant que quelqu'un trouve :lol:
    Merci !


    EDIT: J'ai finalement trouvé après d'autres recherches, et c'était l'idée que j'avais écrite..
    Pour ceux pour qui ça peut aider : Il faut juste ajouter le focus (mais apparemment, avant le addKeyListener) !

    public Jeu()
    	{
    		setFocusable(true);
    		addKeyListener(this);
    		
    		
    		tab = new Image[15][15];
    		vide = new CaseVide();
    		sol = new CaseSol();
    		mario = new CaseMario();
    		
    		initTab();
    	}
    



    Val'
    • Partager sur Facebook
    • Partager sur Twitter
    SiteWeb: ICI
      22 octobre 2010 à 20:33:51

      Pour apporter une explication supplémentaire: effectivement, un JPanel n'est pas focusable par défaut, il faut explicitement le rendre focusable avec setFocusable(true).

      Si tu avais ajouté tes listeners sur la fenêtre au lieu du panel, tu n'aurais pas eu ce problème, parce que si dans une fenêtre il n'y a aucun composant focusable, alors c'est la fenêtre elle-même qui prend le focus.
      • Partager sur Facebook
      • Partager sur Twitter
        22 octobre 2010 à 21:20:46

        accessoirement, une méthode de la classe Mario
        public void incY()(
        y=y+1;
        }
        

        remplacerait avantagement l'horrible mario.setY(mario.getY() + 1);
        • Partager sur Facebook
        • Partager sur Twitter

        Problème de KeyListener

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown