teclado keypressed docs java swing keylistener

keypressed - keylistener javafx



keylistener no funciona después de hacer clic en el botón (4)

Tengo un keylistener conectado a mi marco en java, puedo detectar pulsaciones de teclas cuando presiono cualquier tecla, sin embargo, algo extraño está sucediendo. Mi juego es un juego de dragaminas, tengo un botón de reinicio que básicamente borra el tablero y lo recuerda. Lo extraño es que cuando hago clic en el botón con el mouse todo se borra y se recuerda la pizarra, pero el keylistener deja de funcionar. Aún más extraño, tengo un jmenuitem que básicamente hace un clic automático del botón. Así que es como restartbutton.doclick ()

si hago clic en el elemento jmenuitem para reiniciarlo, se reinicia bien, se borra todo y el keylistener aún funciona. Incluso puedo ver que se hace clic en el botón. ¿Alguna idea de por qué esto podría estar pasando?

Gracias

esto está adjunto a mi marco principal. este es el oyente que deja de funcionar después de hacer clic en el botón.

frame.addKeyListener(new KeyListener(){ public void keyReleased(KeyEvent e){ } public void keyPressed(KeyEvent e){ System.out.println("hey"); int keycode = e.getKeyCode(); if(e.isControlDown() & keycode==KeyEvent.VK_C){ balh blah balh } } public void keyTyped(KeyEvent e){ } });


Sugerencias:

  • El suyo es un problema de enfoque, donde KeyListener deja de funcionar porque el contenedor que está escuchando ha perdido el foco en JButton.
  • Una solución es hacer que JButton no pueda obtener el foco llamando a setFocusable(false) en él.
  • Pero te recomiendo que no uses un KeyListener si es posible, sino enlaces de teclas, ya que con los enlaces no tienes este problema y también es un constructo de nivel superior.

Editar
Respecto a:

¿Cuál sería la mejor manera de cambiar eso a un enlace de clave?

Lo mejor sería ir a través del tutorial de Key Bindings y aplicar las recomendaciones que se encuentran allí.


esto es un problema de enfoque, puedes usar este código para enfocar nuevamente

getTopLevelAncestor().requestFocus();


En función de la respuesta a esta pregunta similar , implementé el KeyEventDispatcher en lugar de utilizar los oyentes predeterminados. Sin embargo, creo que esta función será bastante global, por lo que es posible que deba verificar y asegurarse de que las cosas correctas estén visibles / enfocadas.

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher( new KeyEventDispatcher() { public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_PRESSED) { System.out.println("tester"); } return false; }


Pude resolver este problema estableciendo la propiedad setFocused del contenedor para que sea true :

frame.setFocusable(true);