teclado tecla presione presionar para keypressed eventos evento cualquier continuar con activar java swing jframe jpanel keylistener

presione - Java-Esperando algún tipo de pulsación de tecla para continuar



presione cualquier tecla para continuar java (4)

No use un KeyLIstener.

Use enlaces clave. Ya has recibido un enlace al tutorial de enlaces de teclas.

¿Cuál es la mejor manera de implementar un tipo de cosa "presionar x para continuar" en Java?

Específicamente, tengo una clase personalizada que amplía JFrame y una clase personalizada que amplía JPanel. Tengo un Main.java (que tiene una instancia de mi clase JFrame), y hay un punto en el que no quiero continuar hasta que el usuario haya presionado la barra espaciadora:

Main.java:

...code... frame.waitForSpace(); ...more code which gets executed only after space is pressed...

Entonces, en mi clase marco, ¿cómo debería implementar esto?

MyFrame.java:

/* This method only finishes when the space bar is pressed */ public void waitForSpace() { }

Por cierto, tengo KeyListener en mi JFrame que funciona cuando se presiona el botón de espacio. Pero no estoy muy seguro de cómo incorporar eso en lo que estoy tratando de hacer.

¡El código de ejemplo sería increíble!


Pon lo que quieras hacer cuando el usuario presiona espacio en ese controlador. Lo más probable es que no desee hacer (lo que sea) cada vez que se presiona la barra espaciadora, sino solo parte del tiempo; por lo tanto, el controlador de eventos debe depender del valor de alguna variable, y el código que se ejecuta antes de que el usuario presione el espacio debe establecer esa variable en el valor que significa "hacerlo". El controlador debe volver a establecer la variable en el valor predeterminado después de ejecutarse.


Recuerde que las GUI de Swing son impulsadas por eventos. Así que no esperes nada. En su lugar, proporcione a su clase un campo de estado de algún tipo, quizás un booleano, cambie la variable de estado al presionar la tecla, quizás utilizando enlaces de teclas, y luego no permita ciertos comportamientos a menos que el estado haya cambiado (a través de sentencias if).


Usando un CountDownLatch cuando se invoca await (), el hilo main () actual esperará hasta que se llame al método countDown () desde otro hilo.

KeyEventDispatcher le permite agregar un oyente de pulsaciones de teclas globalmente. Por lo tanto, cada vez que se presiona una tecla se llama a dispatchKeyEvent () desde EDT (Event Dispatching Thread) y allí puede verificar si se está presionando ''space'' y liberar el bloqueo de cuenta regresiva que main () está esperando.

Sin embargo, si el hilo que llama a waitForSpace () es el EDT, entonces forzará al EDT a esperar por sí mismo, lo que provocará un punto muerto . Es imposible esperar en el EDT y aún recibir eventos clave hasta donde yo sé.

Esto funcionará siempre que un JFrame tenga foco:

public void waitForSpace() { final CountDownLatch latch = new CountDownLatch(1); KeyEventDispatcher dispatcher = new KeyEventDispatcher() { // Anonymous class invoked from EDT public boolean dispatchKeyEvent(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_SPACE) latch.countDown(); return false; } }; KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher); latch.await(); // current thread waits here until countDown() is called KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher); }