OVH Cloud OVH Cloud

JPanel et KeyListener

2 réponses
Avatar
Olivier
Comment faire en sorte qu'un JPanel recoive les frappes claviers.

J'ai fait

class Panel extends JPanel implements KeyListener {
// Rajout des méthodes qui vont bien...
}

mais il ne reçoit rien ?

Comment faire ?

Merci, Olivier

2 réponses

Avatar
vclassine
"Olivier" wrote in message news:<40328d2e$0$24935$...
Comment faire en sorte qu'un JPanel recoive les frappes claviers.

J'ai fait

class Panel extends JPanel implements KeyListener {
// Rajout des méthodes qui vont bien...
}

mais il ne reçoit rien ?
Bonne nouvelle: c'est normal :-)


Le fait de faire implémenter KeyListener à ta sous-classe de JPanel ne
la fait pas écouter ses propres évènement clavier.

Toute classe qui implémente KeyListener est juste capable d'écouter
n'importe quel JPanel (entre autres, ça doit concerner bcp d'autres
composants), sans plus de config elle n'écoute rien, elle en est juste
capable.

Pour qu'ils écoute les KeyListener doivent être ajoutées au composants
à écouter.

monJPanel.addKeyListener(monImplementationDeKeyListener);

(voir la doc pour nom de fonction éxact)

En l'occurence il faudrait faire un truc du style :

this.addKeyListener(this);

Par contre le fait que ton panel s'écoute est probablement un mauvais
choix de conception...







Comment faire ?




Merci, Olivier


Avatar
Sébastien BALLET
salut,

"Olivier" a écrit dans le message de news:
40328d2e$0$24935$
Comment faire en sorte qu'un JPanel recoive les frappes claviers.

J'ai fait

class Panel extends JPanel implements KeyListener {
// Rajout des méthodes qui vont bien...
}

mais il ne reçoit rien ?

Comment faire ?

Merci, Olivier




C'est normal étant donné que par défaut l'état de focusabilité des JPanel
est fixé à false. Pour
rendre un JPanel focusable il faut utiliser la méthode setFocusable(boolean)
:

public class MyFocusablePanel extends JPanel
{
public MyFocusablePanel()
{
super();
setFocusable(true);
}
}

Dès lors que ton JPanel est focusable, celui-ci est alors en mesure de
recevoir les
événement clavier. A ce niveau, tu as 2 solutions :

a)
surcharger la méthode JPanel.processKeyEvent(KeyEvent). Cette méthode est
héritée
de Component :

public class MyFocusablePanel extends JPanel
{
public MyFocusablePanel()
{
super();
setFocusable(true);
}

protected void ProcessKeyEvent(KeyEvent pEvent)
{
// traitement de l'événement. Attention a ne pas oublier de faire
// un pEvent.consume() pour chaque événement devant être marqué
// comme ayant été traité
}
}


b)
implémenter l'interface KeyListener afin de traiter les événements clavier :

public class MyFocusablePanel extends JPanel implements KeyListener
{
public MyFocusablePanel()
{
super();
setFocusable(true);
addKeyListener(this);
}

public void keyPressed(KeyEvent pEvent)
{
}

public void keyReleased(KeyEvent pEvent)
{
}

public void keyTyped(KeyEvent pEvent)
{
}
}


a+
seb