Implementar eventos de teclado no es complicado como algunos piensan. Sin embargo, deben realizar algunos pasos para hacerlo funcionar correctamente. Agregar este tipo de evento te permite crear una interfaz mas compleja con atajos. Permitiendo al usuario ejecutar otras funciones del programa rápidamente.

Ademas, si deseas crear juegos a futuro. Es importante conocer este tipo de eventos, pues son primordiales para darle movimiento al personaje y asignarle diferentes acciones con determinada combinación de teclas.

Los eventos generados solamente son tres, podrás implementarlos utilizando la clase KeyListener o KeyAdapter.

KeyListener: es una interfaz, por lo que obliga a re-escribir todos los métodos. Cada método con una acción especifica para detectar el evento.

KeyAdapter: esta clase ya implementa la interfaz, por este motivo no es necesario re-escribir todos los métodos. Solo re-escribirás los métodos que pienses utilizar.

Descripción de los Métodos

keyPressed: invocado cuando el usuario presiona cualquier tecla.

keyReleased: invocado cuando se ha dejado de pulsar la tecla (mas abajo mostrare un evento que dejara claro cuando se invoca este método).

keyTyped: es lo misma función del método keyPressed, la única diferencia, es que el método solo funciona cuando se presionan teclas que no son de acción (es decir: teclas como fin, alt, f6, entre otras. No son reconocidas por este método).

EL evento que usare para dejar claro el funcionamiento de estos métodos, consiste en un panel al cual cambiaremos el color de fondo. Primero comencemos creando nuestro marco (JFrame):

package eventoteclado;

import javax.swing.JFrame;

public class EventoTeclado {

    public static void main(String[] args) {
        JFrame f = new JFrame("Eventos de Teclado");
        PanelTeclado panel = new PanelTeclado();
        OyenteTeclado oyente = new OyenteTeclado(panel);
        panel.addEventos(oyente);
        f.add(panel);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.setBounds(300, 200, 500, 400);
    }
    
}
package eventoteclado;

import javax.swing.JPanel;

public class PanelTeclado extends JPanel {
    
    public void addEventos(OyenteTeclado e) {
        /*Cuando usamos un evento de teclado, es necesario indicarle donde se tendrá el foco,
        sino indica el foco, nunca funcionara el evento.*/
        this.setFocusable(true);
        this.addKeyListener(e);
    }
    
}

Si trabajamos con eventos de teclado, es importante indicar quien tendrá el foco (con esto me refiero, a la parte donde se usaran los eventos de teclado). Esto lo hacemos con el método: setFocusable(). Sino indica quien tendrá el foco, los eventos de teclado no funcionaran, podrás observar  que dentro del código anterior se pasa por parámetro el valor true al método, indicando que tiene el foco.

addKeyListener: indica que usara eventos de teclado, por parámetro recibe un objeto de tipo KeyListener.

Implementando métodos para Evento de Teclado

Creamos nuestra clase con los métodos para gestionar el evento de teclado:

package eventoteclado;

import java.awt.Color;
import java.awt.event.*;

public class OyenteTeclado implements KeyListener {

    private PanelTeclado panel;

    public OyenteTeclado(PanelTeclado panel) {
        this.panel = panel;
    }

    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("Solo funciona cuando presiona teclas que no son Fin, ALT, F6, entre otros.");
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("color");
        switch (e.getKeyCode()) {
            case KeyEvent.VK_R://cambia fondo a color rojo
                panel.setBackground(Color.RED);
                break;
            case KeyEvent.VK_G://cambia fondo a color verde
                panel.setBackground(Color.GREEN);
                break;
            case KeyEvent.VK_B://cambia fondo a color azul
                panel.setBackground(Color.BLUE);
        }
        System.out.println("Se activa al presionar cualquier tipo de telcla.");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        panel.setBackground(null);
        System.out.println("Se lanzara msg cuando se deja de pulsar la telcla.");
    }

}

El código anterior funciona de manera sencilla, con el objetivo de mostrarte la función de cada método de manera fácil.

Dentro del metodo keyPressed agregue el codigo para cambiar el color de fondo, si usted mantiene presionada la tecla R, G o B. Cambia el color de fondo al correspondiente:

Sin embargo, en el momento cuando dejas de presionar la tecla, el color de fondo vuelve a la normalidad. Cabe mecionar, que al metodo keyTyped no se agrego codigo extra, pues funciona similar al keyPressed.