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.
Muchas Gracias Informacion reciente y confiable has salvado a un estudiante de java
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…
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.
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?