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
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();
}
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.
× 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.