Pregunta

Estoy buscando simular la acción de mantener una tecla de teclado durante un corto período de tiempo en Java. Esperaría que el siguiente código mantenga presionada la tecla A durante 5 segundos, pero solo lo presiona una vez (produce un solo 'A', al probar en el bloc de notas). ¿Alguna idea si necesito usar algo más, o si solo estoy usando la clase Awt.Robot mal aquí?

Robot robot = null; 
robot = new Robot();
robot.keyPress(KeyEvent.VK_A);
Thread.sleep(5000);
robot.keyRelease(KeyEvent.VK_A);
¿Fue útil?

Solución

Thread.sleep () detiene el hilo actual (el hilo que mantiene presionado la clave) se ejecuta.

Si desea que mantenga la llave baja por un tiempo determinado, tal vez debería ejecutarla en un hilo paralelo.

Aquí hay una sugerencia que superará el problema Thread.sleep () (usa el patrón de comando para que pueda crear otros comandos e intercambiarlos dentro y fuera a voluntad):

public class Main {

public static void main(String[] args) throws InterruptedException {
    final RobotCommand pressAKeyCommand = new PressAKeyCommand();
    Thread t = new Thread(new Runnable() {

        public void run() {
            pressAKeyCommand.execute();
        }
    });
    t.start();
    Thread.sleep(5000);
    pressAKeyCommand.stop();

  }
}

class PressAKeyCommand implements RobotCommand {

private volatile boolean isContinue = true;

public void execute() {
    try {
        Robot robot = new Robot();
        while (isContinue) {
            robot.keyPress(KeyEvent.VK_A);
        }
        robot.keyRelease(KeyEvent.VK_A);
    } catch (AWTException ex) {
        // Do something with Exception
    }
}

  public void stop() {
     isContinue = false;
  }
}

interface RobotCommand {

  void execute();

  void stop();
}

Otros consejos

¿Sigue presionando?

import java.awt.Robot;
import java.awt.event.KeyEvent;

public class PressAndHold { 
    public static void main( String [] args ) throws Exception { 
        Robot robot = new Robot();
        for( int i = 0 ; i < 10; i++ ) {
            robot.keyPress( KeyEvent.VK_A );
        }
    }
}

¡Creo que la respuesta proporcionada por Edward servirá!

No hay un evento de Keydown en Java.lang.Robot. Probé esto en mi computadora (probando en una consola en Linux en lugar de con el bloc de notas) y funcionó, produciendo una cadena de A. ¿Quizás esto es solo un problema con el bloc de notas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top