¿Cómo compruebo si el usuario está presionando una tecla?
En Java tengo un programa que necesita verificar continuamente si un usuario está presionando una tecla. Entonces, en psuedocódigo, algo así como
if (isPressing("w")) {
// do somthing
}
Aceptado
En Java no verificas si se presiona una tecla, sino que escuchas s KeyEvent
. La forma correcta de lograr su objetivo es registrar un KeyEventDispatcher
e implementarlo para mantener el estado de la clave deseada:
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
public class IsKeyPressed {
private static volatile boolean wPressed = false;
public static boolean isWPressed() {
synchronized (IsKeyPressed.class) {
return wPressed;
}
}
public static void main(String[] args) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent ke) {
synchronized (IsKeyPressed.class) {
switch (ke.getID()) {
case KeyEvent.KEY_PRESSED:
if (ke.getKeyCode() == KeyEvent.VK_W) {
wPressed = true;
}
break;
case KeyEvent.KEY_RELEASED:
if (ke.getKeyCode() == KeyEvent.VK_W) {
wPressed = false;
}
break;
}
return false;
}
}
});
}
}
Entonces siempre puedes usar:
if (IsKeyPressed.isWPressed()) {
// do your thing.
}
Por supuesto, puede utilizar el mismo método para implementar isPressing("<some key>")
con un mapa de claves y su estado dentro IsKeyPressed
.
Prueba esto:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Main {
public static void main(String[] argv) throws Exception {
JTextField textField = new JTextField();
textField.addKeyListener(new Keychecker());
JFrame jframe = new JFrame();
jframe.add(textField);
jframe.setSize(400, 350);
jframe.setVisible(true);
}
class Keychecker extends KeyAdapter {
@Override
public void keyPressed(KeyEvent event) {
char ch = event.getKeyChar();
System.out.println(event.getKeyChar());
}
}