Hook clavier pour intercepter un caractère
L'ajout d'un listener sur KeyboardFocusManager permet d'intercepter les touches appuyées sur le clavier au plus tot. Sur l'ensemble du JFrame, l'écouteur envoie les évènements clavier avant d'ętre transmis au control détenant la focalisation.Dans l'exemple, toutes les touches de la fenętre sont interceptées et modifiées en caractère majuscule ou bloquer lorsqu'elles corresponde à des chiffres.
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
/**
* Filtrer les touches du clavier
* http://www.fobec.com/java/992/intercepter-tous-evenements-clavier.html
*
* @author Axel 2010
*/
public class KeybordHook extends javax.swing.JFrame {
/** Creates new form KeybordHook */
public KeybordHook() {
initComponents();
//Ajouter le listener pour avoir que des chiffres
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_TYPED) {
char c = e.getKeyChar();
System.out.println("Appui de la touche: " + c);
// Filtre: mettre toutes les lettres en majuscules
if (Character.isLowerCase(c)) {
c = Character.toUpperCase(c);
e.setKeyChar(c);
return false;
}
//Filtre: supprimer les chiffres
if (Character.isDigit(c)) {
return true;
}
}
//par defaut
return false;
}
});
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
final KeybordHook frame = new KeybordHook();
frame.setDefaultCloseOperation(KeybordHook.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
L'ajout d'un listener KeyboardFocusManager permet d'agir de 2 manières sur les touches appuyées:
- modifier le caractère: dans notre exemple, toutes les caractères minuscules sont automatiquement transformées en caractères majuscules puis transmis à un JTextField par exemple,
- supprimer un message: un appui de touche peut etre supprimé de la liste des evenements, dans notre cas, toutes les nombres sont supprimés avec d'atteindre un controle de type JTextField.