Capturar la tecla Enter o cualquier otra tecla en un evento en Java

Hola a todos, hoy os explicare como capturar teclas concretas en un evento en Java. Es posible que quieras realizar alguna acción al pulsar algún botón concreto, como hemos visto hasta ahora con los eventos, el evento mas adecuado es el KeyListener.

Supongamos que queremos que aparezca un mensaje al pulsar Enter y si pulsamos Escape saldremos de la aplicación.

Podemos usar unas constantes muy útiles de KeyEvent, que empiezan por VK_ y siguen con el nombre de la tecla.

El código en principio sería así:

import java.awt.EventQueue;
import java.awt.event.*;
import javax.swing.*;

public class EjemploCapturar extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EjemploCapturar frame = new EjemploCapturar();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public EjemploCapturar() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setLayout(null);
		setContentPane(contentPane);

		//Eventos

		contentPane.addKeyListener(new KeyListener(){
			public void keyTyped(KeyEvent e){
				//Aqui no funcionara
			}
			public void keyPressed(KeyEvent e){
				if(e.getKeyCode()==KeyEvent.VK_ENTER){
					JOptionPane.showMessageDialog(contentPane, "Has pulsado Enter");
				}
				if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
			public void keyReleased(KeyEvent e){
				//Aqui tambien puedes insertar el codigo
			}
		});
	}

}

Si pruebas el siguiente código, no funcionara. Debemos usar el método setFocusable(false) del componente contentPane, lo añadimos, así quedaría:

import java.awt.EventQueue;
import java.awt.event.*;
import javax.swing.*;

public class EjemploCapturar extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EjemploCapturar frame = new EjemploCapturar();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public EjemploCapturar() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setLayout(null);
		setContentPane(contentPane);

		//Invocamos el método, ahora si funcionara
		contentPane.setFocusable(true);

		//Eventos

		contentPane.addKeyListener(new KeyListener(){
			public void keyTyped(KeyEvent e){
				//Aqui no funcionara
			}
			public void keyPressed(KeyEvent e){
				if(e.getKeyCode()==KeyEvent.VK_ENTER){
					JOptionPane.showMessageDialog(contentPane, "Has pulsado Enter");
				}
				if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
			public void keyReleased(KeyEvent e){
				//Aqui tambien puedes insertar el codigo
			}
		});
	}

}

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

4 comentarios

  1. Carlos

    Muchas Gracias Informacion reciente y confiable has salvado a un estudiante de java

  2. Darwin

    Una pregunta.. estoy haciendo un juego de serpientes y escaleras en java… pero me piden que al presionar la tecla R o r se muestre de nuevo el menú inicial
    1. Iniciar Juego
    2. Regresar al juego

    pero que no se borre la partida actual (que quede en el turno del jugador en que iba) y al seleccionar 2. Regresar al juego .. seguir normalmente con los turnos

    Tengo algo de idea de usar un evento para saber si presionó la tecla R pero es en consola…

  3. Juan

    Darwin, creo que con la implementación de hilos junto con los eventos puedes lograr ello.
    Tambien creo que para esta fecha de contestar tu respuesta ya has logrado hacerlo, asi que cuentanos como lo has hecho.

  4. Brian

    Hola, estoy haciendo un programa que imprime el abecedario (un string) este se va a imprimiendo letra por letra (ciclo for) cada cierto tiemp(Thread. Sleep). Mi profesor me pide que al presionar una tecla este se detenga. ¿Que podría hacer?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *