nicht blockierende Tastatureingabe

TimoTH

Mitglied
Hi zusammen!
Ich habe eine kleine Applikation die ich um eine Konsolenanwendung erweitert habe.
Die Konsole erwartet logischerweise Eingaben über die Tastatur.
Ziemlich vereinfacht sieht das so aus:
Code:
while(true){
   String input = System.in.readLine();
   Mainapplication.doSomething(input);
}
Wann diese Eingaben erfolgen, ist zeitlich unbestimmt. Ebenso unbestimmt ist, wann das Hauptprogramm irgendwelche für den Benutzer nicht sichtbare Methoden der Konsole aufruft.
Das Problem dabei ist, Aufrufe a la "System.in.readLine();" blockieren das System, bis die Eingabe erfolgt ist. Habe schon ne Menge ausprobiert, wie zum Beispiel alles in unterschiedlichen Threads laufen zu lassen. Aber das funktioniert alles nicht.
Ich bräuchte eine Tastatureingabe, welche halt nicht blockiert. Gibt es sowas?

*gruss*
TimoTH
 
Hi Erdal!
Danke für die Antwort nur kommt sie leider nicht als Lösung meines Problems in Frage.
Ein Menü wie in dem Link habe ich ja schon, nur
da die Konsole quasi der GUI Ersatz für meine Hauptanwendung ist, darf sie nicht beendet werden.
Sie muss ständig bereit sein, Tastatureingaben zu handlen, allerdings halt ohne alles zu blockieren. Vielleicht eine andere Idee?


Zum Thema GUI Ersatz hätte ich noch eine Frage: Die Konsole wird später auf Systemen verwendet, die keine Graphische Benutzeroberflächen zulassen. Aber, ich könnte ja dennoch irgendeine Swing-Komponente erstellen, dieser aber nicht sichtbar machen. Das sollte solche Systeme doch nicht stören, oder?
Denn falls das geht, könnte ich doch einfach eine unsichtbare SwingKomponente erstellen, auf dieser den Focus setzen und dann einfach einen Keylistener nutzen, um die Tastatureingaben abzufangen. Wäre das möglich?

*gruss*
Timo
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.swing.JOptionPane;

/**
 * @author Thomas.Darimont
 * 
 */
public class ConsoleInputProcessorExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ExecutorService executorService = Executors.newSingleThreadExecutor();
		new ConsoleInputProcessor(executorService).start();
		while (true) {
			try {
				TimeUnit.SECONDS.sleep(5);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(System.currentTimeMillis());
		}
	}

	static class ConsoleInputProcessor implements Runnable {

		ExecutorService executorService;

		boolean stopped;

		public ConsoleInputProcessor(ExecutorService executorService) {
			this.executorService = executorService;
		}

		public void run() {

			Scanner scanner = new Scanner(System.in);
			System.out.println("Ready for Console Input!");
			while (!stopped && scanner.hasNextLine()) {
				processLine(scanner.nextLine());
			}
		}

		public void start() {
			executorService.execute(this);
		}

		private void processLine(String line) {
			if (line.equals("EXIT")) {
				stopped = true;
				System.exit(0);
			} else {
				JOptionPane.showMessageDialog(null, line);
			}
		}
	}
}

Gruß Tom
 
Zurück