Domanda

Sto cercando di simulare l'azione di possesso di un tasto della tastiera verso il basso per un breve periodo di tempo in Java. Mi aspetto il seguente codice per tenere premuto il tasto A per 5 secondi, ma solo una volta preme (produce una singola 'a', durante la prova, Blocco note). Qualsiasi idea se ho bisogno di usare qualcosa di diverso, o se sto solo utilizzando la classe awt.Robot male qui?

Robot robot = null; 
robot = new Robot();
robot.keyPress(KeyEvent.VK_A);
Thread.sleep(5000);
robot.keyRelease(KeyEvent.VK_A);
È stato utile?

Soluzione

Thread.sleep () arresta il thread corrente (il filo che sta tenendo premuto il tasto) da eseguire.

Se si desidera tenere premuto il tasto per un determinato periodo di tempo, forse si dovrebbe eseguire in un thread in parallelo.

Ecco un suggerimento che aggirare il problema Thread.sleep () (utilizza il modello di comando in modo da poter creare altri comandi e scambiare dentro e fuori a piacimento):

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

Altri suggerimenti

Basta tenere premuto?

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

Credo che la risposta fornita da Edward farà !!

Non ci sono eventi in keyDown java.lang.Robot. Ho provato questo sul mio computer (test su una console sotto Linux invece che con notepad) e ha funzionato, producendo una serie di a. Forse questo è solo un problema con il NotePad?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top