2015-08-13 7 views
6

Ich schreibe ein wirklich einfaches Programm, aber ich habe ein Problem festgestellt. Im Folgenden ist ein Stück meines Codes (es ist ein wirklich dummes Programm ist, versuchen Sie nicht zu erraten, was ich verwende es für.)Benutzereingaben deaktivieren, bis Thread.sleep() beendet

System.out.println("Please press the Return button a 1000 times."); 
    for(int i = 1;i < 25;i++) { 
     input.nextLine(); 
    } 
    System.out.println("Stop! Stop! Jeez, that was a joke! Do you think I'd make you press that button a 1000 times?"); 
    try { 
    Thread.sleep(3000); 
    } catch (InterruptedException e) {} 
    System.out.println("Let's move on."); 

Was wäre hier geschehen ist, dass das Programm den Benutzer auffordert, zu Drücken Sie die Return-Taste 1000 mal, wodurch der Benutzer schließlich mit dem Spammen beginnen würde. Das Hauptproblem ist, dass, nachdem ich erklärt habe, dass es ein Scherz war und er es nur 25 Mal drücken musste, ich die Benutzereingabe deaktivieren möchte, da es wahrscheinlich ist, dass der Benutzer den Knopf mehrmals drückt, bevor er merkt, dass ich es war nur scherzen. Aber wenn die thread.sleep ausgeführt wird, ist die Benutzereingabe immer noch aktiv, was zu mehreren Problemen führt.

Gibt es also eine Möglichkeit, die Benutzereingabe zu deaktivieren, während das Programm schläft?

+0

Warum interessieren Sie sich? Liegt es daran, dass das Programm später etwas anderes von "Input" liest? Wenn "Eingabe" die Konsole ist, kann es "schwierig" sein, sie zu deaktivieren. Vielleicht wäre eine bessere Lösung, die zusätzlichen Leerzeilen zu lesen und zu ignorieren, wenn das Programm das nächste Mal wünscht, dass der Benutzer etwas eingibt. –

Antwort

-1

Ich glaube, dass es genug ist 1 Zeile Code (james großer Vorschlag) hinzuzufügen:

System.out.println("Let's move on."); 
System.in.read(new byte[System.in.available()]);//read and ignore 
+1

Das ist einfach, aber es hängt stark vom System ab, wie sich System.in genau verhält. Manchmal ist available() nur immer 0 (InputStream-Standardimplementierung, siehe Javadoc). – Gustave

+1

Die available() - Methode sollte * nie * verwendet werden, um die verfügbare Eingabegröße zu erraten, ihre vollständige Implementierung hängt davon ab, wie die tatsächliche Menge an verfügbarer Eingabe und die zurückgegebene Menge korrelieren. Während es in einigen Einstellungen völlig in Ordnung ist, ist es einer dieser Missbräuche, die Sie beißen, wenn Sie es am unpassendsten erwarten. – Durandal

1

Sie können steuern, was von der Konsole über Anwendung zu lesen .. Aber Eingang zu deaktivieren vollständig sein wird, abhängig von der Art der Umgebung, in der die Anwendung läuft ... Für zB in cmd Zeile sollte es nicht möglich sein, nach 25 eingegeben eingeben ... Während in der IDE wie Eclipse, können Sie auf der Konsole eingeben, aber es wird nicht von der Anwendung nach 25 Zeilen gelesen werden.

0

Werfen Sie einen Blick auf diese:

public class Main {  

private static final String QUIT = "quit"; 
private static final int COUNT = 1000; 

public static void main(String[] args) throws InterruptedException { 
    new Main(new BufferedReader(new InputStreamReader(System.in))).main(); 
} 

private final BufferedReader in; 
private final BlockingQueue<String> lines = new ArrayBlockingQueue<>(1); 
private volatile boolean ignore; 

public Main(BufferedReader in) {this.in = in;} 

private void main() throws InterruptedException { 
    Thread inputReader = new Thread(this::read, "input-reader"); 
    inputReader.setDaemon(true);   
    System.out.println("Please press the Return button a "+COUNT+" times."); 
    inputReader.start(); 
    String line = ""; 
    for(int i = 1;i <= 25;i++) { 
     line = lines.take(); 
     System.out.println("Good! You entered '"+line+"'. Only "+(COUNT-i)+" left."); 
    } 
    System.out.println("Stop! Stop! Jeez, that was a joke! Do you think I'd make you press that button a "+COUNT+" times?"); 
    ignore = true; 
    Thread.sleep(3000); 
    ignore = false; 
    String optionalLine = lines.poll(); 
    if(optionalLine!=null) { 
     line = optionalLine; System.out.println("Ignored:" + line); 
    } 
    System.out.println("Let's move on. Type "+QUIT+" when you're tired."); 
    while(!QUIT.equalsIgnoreCase(line)){ 
     line = lines.take(); 
     System.out.println(">"+line); 
    } 
    System.out.println("Bye."); 
} 

private void read(){ 
    try { 
     String line = in.readLine(); 
     while(line!=null){ 
      if (ignore) { 
       boolean inserted = lines.offer(line); 
       if (!inserted) 
        System.out.println("Ignored:" + line); 
      } else {lines.put(line);} 
      line = in.readLine(); 
     }   
    } catch (IOException|InterruptedException e) {e.printStackTrace();} 
} 

}