x

Cómo detectar pulsaciones de teclas en Java

Por matthew cory
Saber cuándo un usuario pulsa una tecla determinada es importante.
Comstock/Comstock/Getty Images

Aunque la mayoría de las necesidades de obtener entradas de usuario se manejan de forma bastante sencilla en Swing a través de componentes estándar, por ejemplo, obtener el texto a través de un componente JTextField, a veces es necesario obtener las pulsaciones de teclas exactas del usuario. Quizás una combinación de teclas determinada generará una determinada acción, o puede que quieras evitar determinadas pulsaciones de teclas para que no tengan el efecto predeterminado, como permitir sólo caracteres alfabéticos en una caja de texto. Sea cual sea el escenario, conseguir la tecla que el usuario ha pulsado es sencillo.

Paso 1

Crea una sencilla clase que cree y muestre un JFrame de momento:

import java.awt.Dimension; import java.lang.reflect.InvocationTargetException;

import javax.swing.JFrame; import javax.swing.SwingUtilities;

public final class KeyPressTester implements Runnable {

public static void main(String[] args) throws InterruptedException, InvocationTargetException { SwingUtilities.invokeAndWait(new KeyPressTester()); }

@Override public void run() { frame = new JFrame("KeyPress Tester");

frame.setSize(new Dimension(800, 600)); frame.setVisible(true); }

private JFrame frame; }

Paso 2

Modifica el método run() para añadir un KeyListener al marco con la siguiente implementación:

frame.addKeyListener(new KeyListener() {

@Override public void keyTyped(KeyEvent e) {
}

@Override public void keyReleased(KeyEvent e) {
}

@Override public void keyPressed(KeyEvent e) { System.out.println("Key Character: " + e.getKeyChar() + "; Key Code: " + KeyEvent.getKeyText(e.getKeyCode())); } });

Paso 3

Compila y ejecuta el programa. Si pulsas una tecla cuando el marco tiene el foco, deberías ver una salida de consola que describe la tecla pulsada, incluyendo el carácter de texto actual (si está disponible) y el texto de la tecla, como Shift, Ctrl, Retroceso, etc.