Pergunta

Estou procurando simular a ação de segurar uma chave de teclado por um curto período de tempo em Java. Eu esperaria que o código a seguir mantenha pressionado a chave A por 5 segundos, mas apenas o pressiona uma vez (produz um único 'A' ao testar no bloco de notas). Alguma ideia se eu precisar usar outra coisa, ou se estou apenas usando a classe AWT.ROBOT errada aqui?

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

Solução

Thread.sleep () interrompe o encadeamento atual (o encadeamento que está mantendo a chave) da execução.

Se você deseja que ele mantenha a tecla pressionada por um determinado período de tempo, talvez você deva executá -lo em um encadeamento paralelo.

Aqui está uma sugestão que contornará a questão do thread.sleep () (usa o padrão de comando para que você possa criar outros comandos e trocá -los dentro e fora à vontade):

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();
}

Outras dicas

Apenas continue pressionando?

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 );
        }
    }
}

Eu acho que a resposta fornecida por Edward fará !!

Não há evento KeyDown em java.lang.robot. Eu tentei isso no meu computador (testando em um console no Linux em vez de no bloco de notas) e ele funcionou, produzindo uma série de A's. Talvez isso seja apenas um problema com o bloco de notas?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top