Intercepter des frappes de touches

     

alt : l'applet n'est pas visible par votre navigateur (dans le menu Outils, Modules complémentaires, activer le plugin Java(TM) Platform SE 6 U32 6.0.320.5 s'il est désactivé)

Dans l'applet ci-dessus, le disque change de couleur selon la touche sur laquelle on presse. Le disque disparaît avec la touche 'e'.
ATTENTION : sans doute cette applet ne fonctionne qu'après que vous ayez passé la souris à travers son cadre à cause d'un problème de focus (l'événement : "la souris rentre dans le JPanel" est intercepté de telle sorte que cela donne le focus à l'applet) .

Voici le code d'une application à peu près identique à l'applet ci-dessus.

Observez bien l'utilisation de l'instruction requestFocus. Cette instruction nous sert à indiquer le composant qui reçoit l'événement correspondant aux frappes des touches, ici le composant interne de la fenêtre. Pour que l'instruction soit prise en compte, il faut qu'elle intervienne après l'ouverture de la fenêtre, c'est pourquoi nous passons par l'événement "fenêtre ouverte". Si, dans un autre programme, vous avez l'impression que les frappes des touches ne sont pas interceptées, pensez à la question du "focus".

On pourra remarquer qu'on fait aussi en sorte que l'ovale grandisse ou diminue en fonction de la taille de la fenêtre.


import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

class Ardoise extends JPanel {
Ardoise() {
setPreferredSize(new Dimension(100, 100));
setForeground(Color.RED);
}

public void paintComponent(Graphics g) {
int largeur = getSize().width;
int hauteur = getSize().height;

super.paintComponent(g);
g.fillOval(10, 10, largeur - 20, hauteur - 20);
}
}

public class Touches extends JFrame implements KeyListener {
Ardoise ardoise = new Ardoise();
JLabel labelR = new JLabel(" touche r : ovale rouge");
JLabel labelB = new JLabel(" touche b : ovale bleu");
JLabel labelV = new JLabel(" touche v : ovale vert");
JLabel labelE = new JLabel(" touche e : effacer");
JPanel indications = new JPanel();

Touches() {
indications.setLayout(new GridLayout(4, 1));
indications.add(labelR);
indications.add(labelB);
indications.add(labelV);
indications.add(labelE);
add(indications, BorderLayout.NORTH);
add(ardoise, BorderLayout.CENTER);
addKeyListener (this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowOpened(WindowEvent e) {
requestFocus();
}
});
pack();
setVisible(true);
}

public void keyPressed(KeyEvent evt){}

public void keyReleased(KeyEvent evt){}

public void keyTyped(KeyEvent evt) {
if (evt.getKeyChar() == 'r')
ardoise.setForeground(Color.RED);
else if (evt.getKeyChar() == 'b')
ardoise.setForeground(Color.BLUE);
else if (evt.getKeyChar() == 'v')
ardoise.setForeground(Color.GREEN);
else if (evt.getKeyChar() == 'e')
ardoise.setForeground(ardoise.getBackground());
repaint();
}
}
class EssaiTouches {
public static void main(String[] argv) {
new Touches();
}
}

Vous pouvez voir :

  • le Touches.java code de l'application.
  • le code de l'applet
    getSize().width : on récupère ainsi la largeur du JPanel.
    KeyListener : l'interface java.awt.event.KeyListener permet, à condition de ne pas oublier d'utiliser la méthode addKeyListener(KeyListener) définie dans java.awt.Component, de gérer des actions sur les touches lorsque le focus est dans le composant concerné. Cette interface déclare les méthodes ; qu'il faut donc définir dans notre classe.
    addWindowListener; : on ajoute ici un listener en utilisant une classe interne anonyme.
    new WindowAdapter(); : la classe java.awt.event.WindowAdapter implémente l'interface java.awt.event.WindowListener ; cette interface déclare les méthodes : L'interface WindowAdapter implémente ces méthodes avec un corps vide.
    requestFocus(); : cette instruction demande à ce que le focus soit dans le composant concerné. Ici, au départ de l'application, la fenêtre aura le focus : dès qu'on actionne une des touches 'b', 'r', 'v' ou 'e', cela a une action sur l'ovale.
    ardoise.setForeground(ardoise.getBackground()); : on récupère la couleur "du fond" de l'ardoise et on pose que la couleur des tracés sera la même que la couleur du fond. Cela a pour effet d'effacer le disque (en apparence).
    getSize() : méthode de la classe java.awt.Component qui retourne un objet de type java.awt.Dimension ; une telle instance possède deux attributs entiers : width et height.

    © Irène Charon, Télécom ParisTech 2011