Algorithmique et langage Java

Pour traiter les évènements clavier dans un composant qui n'est pas à l'origine conçu pour en recevoir, comme un JPanel, on peut procéder comme pour la souris, en utilisant KeyListener à la place de MouseListener.

Il faudra alors écrire les trois méthodes keyPressed, keyReleased et keyTyped.

La première décrit ce qui doit se passer quand un bouton a été enfoncé, la seconde, lorsqu'il a été relâché, la dernière, lorsqu'une touche a été frappée (enfoncée puis relâchée).

Il faut en plus ajouter dans le constructeur du composant l'instruction setFocusable(true); pour qu'il puisse prendre le "focus" dans une fenêtre (c'est à dire devenir l'élément actif de la fenêtre, celui qui reçoit les évènements clavier).

Les méthodes keyPressed, keyReleased et keyTyped prennent un paramètre de type KeyEvent à l'aide duquel on peut savoir quelle touche est concernée.

La méthode getKeyChar() de KeyEvent renvoie le caractère saisi.

La méthode getKeyCode () de KeyEvent renvoie le code de la touche concernée (cela permet de gérer aussi les touches spéciales comme les flèches, ctrl; alt...)

La signification des codes renvoyés peut être décodée en les comparant à des constantes de KeyEvent, répertoriées par exemple ici.

Les programme ci-dessous détecte ainsi les flèches haute et basse.


import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import java.awt.Font;

class PanneauPerso extends JPanel implements KeyListener{
	int niveau=128;
	PanneauPerso(){
		setOpaque(true);
		setBackground(new Color(niveai,niveau,niveau));
		setFocusable(true);
		addKeyListener(this);
		
		}
	
	public void keyPressed(KeyEvent e) {
		int code=e.getKeyCode(); 
		switch (code){
		   case (KeyEvent.VK_DOWN):        // quand le code correspond à celui de la fleche basse non numerique
			    if(niveau>15){niveau-=4;}  // on diminue la valeur du niveau de gris
		         envoyeur.setBackground(new Color(niveau, niveau, niveau)); // crée un gris et l'attribue à la couleur de fond du panneau envoyeur
		         envoyeur.repaint();       // redessine le panneau pour que la modification soit visible
		   break;
		   case (KeyEvent.VK_UP): 
			   if(niveau<240){niveau+=4;} ;
			   envoyeur.setBackground(new Color(niveau, niveau, niveau));
			   envoyeur.repaint();
		   break;
		  }
		
	}
	
	public void keyReleased(KeyEvent e) {
		 // cette méthode, ici, ne fait rien		
	}
	
	public void keyTyped(KeyEvent e) {
		char caractere_saisi=e.getKeyChar();
		System.out.println(caractere_saisi);
		Graphics g=getGraphics();
		g.setFont(new Font(Font.SERIF,Font.BOLD,25));
		g.setColor(Color.green);
	    int x=(int)(20+400*Math.random());
	    int y=(int)(20+500*Math.random());
	    g.drawString(caractere_saisi+"", x,y);
		
	}
	
	
}



public class Clavier extends JFrame {
	
	Clavier(){
		setSize(500,700);
		getContentPane().add(new PanneauPerso());
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new Clavier();

	}

}
 
Licence Creative Commons
licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé
Auteur : Nathalie Bonnin
Professeur de Physique, Chimie, Informatique au lycée La Martinière Monplaisir (Lyon 8ème)
Contact :
nathalie.bonnin (chez) scientillula.net
Licence Creative Commons
La totalité du contenu du site Scientillula.net appartient à Nathalie Bonnin et est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé