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 :