Utilice KeyListener en Java

Mohammad Irfan 12 octubre 2023
  1. Clase KeyEvent
  2. Implementación de la interfaz KeyListener
  3. Una aplicación simple de KeyListener
  4. Una aplicación de juego simple usando KeyListener
  5. Resumen
Utilice KeyListener en Java

Este tutorial presenta cómo usar KeyListener en Java y enumera algunos códigos de ejemplo para comprender el tema.

KeyListener es una interfaz que se ocupa de los cambios en el estado de las teclas de nuestro teclado. Como sugiere el nombre de la interfaz, escucha las claves y actúa en consecuencia.

En este tutorial, aprenderemos cómo implementar esta interfaz y trabajar con eventos clave.

Clase KeyEvent

Siempre que se presiona una tecla del teclado, un objeto de la clase KeyEvent notifica al KeyListener. La clase KeyEvent tiene algunos métodos que se utilizan para obtener más información sobre el evento clave. A continuación se resumen tres de los métodos más importantes de esta clase.

  • El método getKeyChar() obtiene el carácter clave asociado con el evento. Este método es muy beneficioso si queremos agregar alguna funcionalidad a una clave en particular. Por ejemplo, si se presiona e, la aplicación debería salir.
  • El método getKeyCode() es muy similar al método getKeyChar(). Devuelve un código de tecla entero asociado con la tecla presionada.
  • El método isActionKey() puede indicar si se presiona una tecla de acción (como Bloq Mayús). Devuelve un booleano verdadero o falso.

Implementación de la interfaz KeyListener

La interfaz KeyListener escucha eventos clave y realiza alguna acción. La declaración de esta interfaz se muestra a continuación.

public interface KeyListener extends EventListener

Necesitamos anular los siguientes tres métodos de esta interfaz en nuestra clase.

  • El método keyPressed(KeyEvent e) se invocará cuando se presione una tecla.
  • El método keyReleased(KeyEvent e) se invocará cuando se suelte la tecla.
  • El método keyTyped(KeyEvent e) se invocará cuando una tecla escriba un carácter.

También usaremos el método addKeyListener(). Necesitamos pasar un objeto de la clase que implementa la interfaz KeyListener a este método. Es una forma de registrar el objeto para escuchar y reaccionar ante eventos clave.

Una aplicación simple de KeyListener

Creemos una aplicación simple que escuche eventos clave e imprima algo en la consola. Crearemos un marco y le agregaremos una etiqueta. Nuestro programa debería imprimir el carácter clave y la acción clave en la consola. Si la tecla presionada es una tecla de acción, entonces el programa debería terminar.

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyListenerExample implements KeyListener {
  @Override
  public void keyTyped(KeyEvent e) {
    System.out.println("The key Typed was: " + e.getKeyChar());
  }
  @Override
  public void keyPressed(KeyEvent e) {
    if (e.isActionKey())
      System.exit(0);
    System.out.println("The key Pressed was: " + e.getKeyChar());
  }
  @Override
  public void keyReleased(KeyEvent e) {
    System.out.println("The key Released was: " + e.getKeyChar());
  }
  public static void main(String[] args) {
    // Setting the Frame and Labels
    Frame f = new Frame("Demo");
    f.setLayout(new FlowLayout());
    f.setSize(500, 500);
    Label l = new Label();
    l.setText("This is a demonstration");
    f.add(l);
    f.setVisible(true);

    // Creating and adding the key listener
    KeyListenerExample k = new KeyListenerExample();
    f.addKeyListener(k);
  }
}

Producción :

The key Pressed was: a
The key Typed was: a
The key Released was: a
The key Pressed was: b
The key Typed was: b
The key Released was: b

Una aplicación de juego simple usando KeyListener

Creemos otro programa que tomará las teclas de flecha como entrada. Este programa moverá el número 0 a diferentes ubicaciones en el array de acuerdo con la tecla presionada. La salida se imprime en la consola.

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
public class KeyListenerExample implements KeyListener {
  // Matrix and x, y coordinates of 0
  int[][] matrix;
  int x;
  int y;
  KeyListenerExample() {
    // Initializing the Matrix
    matrix = new int[3][3];
    matrix[0] = new int[] {1, 1, 1};
    matrix[1] = new int[] {1, 0, 1};
    matrix[2] = new int[] {1, 1, 1};

    x = 1;
    y = 1;

    // Printing the Matrix
    for (int i = 0; i < 3; i++) System.out.println(Arrays.toString(matrix[i]));
    System.out.println();
  }
  // keyPressed() method takes care of moving the zero according to the key pressed
  @Override
  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
      if (x != 2) {
        x += 1;
        System.out.println("Moving Right");
      } else
        System.out.println("Cannot Move Right");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
      if (x != 0) {
        x -= 1;
        System.out.println("Moving Left");
      } else
        System.out.println("Cannot Move Left");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      if (y != 2) {
        y += 1;
        System.out.println("Moving Down");
      } else
        System.out.println("Cannot Move Down");
    }
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      if (y != 0) {
        y -= 1;
        System.out.println("Moving Up");
      } else
        System.out.println("Cannot Move Up");
    }
    matrix[0] = new int[] {1, 1, 1};
    matrix[1] = new int[] {1, 1, 1};
    matrix[2] = new int[] {1, 1, 1};
    matrix[y][x] = 0;
    for (int i = 0; i < 3; i++) System.out.println(Arrays.toString(matrix[i]));
    System.out.println();
  }
  // We don't need the other two methods
  @Override
  public void keyReleased(KeyEvent e) {}
  @Override
  public void keyTyped(KeyEvent e) {}
  public static void main(String[] args) {
    // Setting the frame and labels
    Frame f = new Frame("Demo");
    f.setLayout(new FlowLayout());
    f.setSize(200, 200);
    Label l = new Label();
    l.setText("This is a Game");
    f.add(l);
    f.setVisible(true);

    // Creating and adding the key listener
    KeyListenerExample k = new KeyListenerExample();
    f.addKeyListener(k);
  }
}

Producción :

[1, 1, 1]
[1, 0, 1]
[1, 1, 1]

Moving Right
[1, 1, 1]
[1, 1, 0]
[1, 1, 1]

Cannot Move Right
[1, 1, 1]
[1, 1, 0]
[1, 1, 1]

Moving Left
[1, 1, 1]
[1, 0, 1]
[1, 1, 1]

Moving Left
[1, 1, 1]
[0, 1, 1]
[1, 1, 1]

Cannot Move Left
[1, 1, 1]
[0, 1, 1]
[1, 1, 1]

Moving Up
[0, 1, 1]
[1, 1, 1]
[1, 1, 1]

Cannot Move Up
[0, 1, 1]
[1, 1, 1]
[1, 1, 1]

Moving Down
[1, 1, 1]
[0, 1, 1]
[1, 1, 1]

Moving Down
[1, 1, 1]
[1, 1, 1]
[0, 1, 1]

Cannot Move Down
[1, 1, 1]
[1, 1, 1]
[0, 1, 1]

Resumen

Las clases implementan la interfaz KeyListener para escuchar y reaccionar ante eventos clave. En este tutorial, aprendimos algunos métodos importantes de la clase KeyEvent. También aprendimos cómo implementar la interfaz KeyListener y cómo anular los métodos keyPressed(), keyReleased() y keyTyped(). También vimos algunos ejemplos que demostraron el uso de esta interfaz.