Reagieren auf Eingabe

Hallo liebe Forengemeinde,

zur Zeit programmiere ich ein wenig herum, um es zu lernen. Als kleines Projekt habe ich mir einen sehr einfachen MP3-Player ausgesucht, der über die Kommandozeile funktionieren soll. Das ganze funktioniert, dank einiger Bibliotheken, auch recht gut – doch jetzt stehe ich vor einem kleinen Problem.

Nachdem die Musik, über eine Abfrage, ausgewählt wurde, werden die Songs als Objekte in er ArrayList angelegt und in einer Schleife ausgegeben – so weit, so gut. Doch jetzt möchte ich es ermöglichen per Eingabe zurück und vor zu spulen, das ganze abzubrechen oder zu pausieren. Diese einzelnen Teile sind ebenfalls programmiertechnisch kein Problem – nur der Zwischenschritt bereitet mir Kopfzerbrechen. Wie kann ich untersuchen, ob der User etwas eingibt, beziehungsweise nichts eingibt?


Algorithmus:

i = 0

Für alle Musikdateien
	Falls keine Eingabe spiele Musik ab und erhöhe i um 1
	Falls Eigabe
		Falls Eingabe =“Nochmal abspielen“  verringere i um 1
		Falls Eingabe =“Überspringen“  verringere i nochmal um 1
		Falls Eingabe =“Pause“  tue nichts, bis Eingabe = „Keine Pause mehr“
		Falls Eingabe =“Ende“ brich Schleife ab


Bislang bin ich jedoch nur so weit, da ich nicht weiss, wie man eine Eingabe optional gestalten kann.

for(Musikdateien gespielteSongs : playlist) {               
                  musikAbspielen(songName);
}

Vielen Dank im Vorraus

weißt du grundsätzlich von einer Eingabe in Java?
im Konsole etwas begrenzt auf ganze Zeilen mit Enter-Taste, soll ‘Nochmal abspielen’ komplett eingetippt werden?
in GUI mit Key Bindings KeyListener leichter einzelne Tasten,

jedenfalls ist Trennung der Aufgaben in Threads zu bedenken, ein Thread verwaltet die Dauerschleife an Musik und Kontrolle der fertigen Eingabe,

ein anderer kümmert sich nebenher um die Eingabe, legt sie in eine Liste von Kommandos ab, oder nur das neueste merken,
mit einer GUI und Eingabekontrolle dort wäre das automatisch separat

bei Zugriff von A) Musik-Schleife als auch B) Eingabe-Einleser auf die gemeinsame Ablage der Eingabe ist auf Synchronisation zu achen
Rheinwerk Computing :: Java ist auch eine Insel - 12 Einführung in die nebenläufige Programmierung

Hallo SlaterB,

wie gesagt bin ich blutiger Anfaenger. Von Threads habe ich noch nie gehoert, hier werde ich mich mal einlesen. Vielen Dank fuer den Link.

weißt du grundsätzlich von einer Eingabe in Java?

Das ist gerade das Problem, wahrscheinlich habe ich es nicht verstaendlich genug ausgedrueck, ich weiss nicht ob der User etwas eingibt oder nicht.

Wenn auf jeden Fall etwas eingegeben werden muss, koennte ich ja pruefen ob die Eingabe leer ist, und einen Inhalt hat - allerdings waere dies bei einer Playliste, bei der man nie etwas aendern moechte auf Dauer etwas nervig, wenn man nach jedem Lieder Enter druecken muss.

Soll ‚Nochmal abspielen‘ komplett eingetippt werden?

Ich dachte eigentlich an Vollstaendige Saetze.

Mit einer GUI und Eingabekontrolle dort wäre das automatisch separat

Ich hoffe ich verstehe Dich richtig, wenn ich anstatt auf die Eingabe in der Konsole, das ganze ueber ein TextField loesen wuerde, dass einen ActionListener besitzt, wuerde sich mein Problem quasi von selbst loesen?

Mit einer GUI und Eingabekontrolle dort wäre das automatisch separat

ein Teil des Problems, ein Extra-Thread für die Eingabe, würde wegfallen, vielleicht 15% Komplexität :wink:
dazu Eingabe an sich ganz anders, je nachdem ob GUI schon bekannt/ aktuell interessant vielleicht nicht zu rechtfertigen

von Konsole einzulesen ist grundsätzlich vorher in der Lernreihenfolge empfehlenswert
Von der Tastatur einlesen - Java als erste Programmiersprache - Javaschublade

statt Sätze evtl. einzelne Zeichen/ Zahlen,
ein Thema dazu zuletzt, wenn auch viel sonstiges mit drin:
http://forum.byte-welt.net/java-forum-erste-hilfe-vom-java-welt-kompetenz-zentrum/java-grundlagen-fuer-anfaenger-und-umsteiger-java-se/14506-buecherrei-buecher-verleih-2-fehler-im-code.html

Problem dabei: wenn Java auf Konsole wartet, dann passiert so lange nix, keine Musik weiter,
deswegen verschiedene Threads nötig, was ein relativ komplexes Konzept ist, allerdings Musik abspielen selber auch nicht ohne…
(habe ich noch nie gemacht, kann natürlich letztlich auch nur kopierter Aufruf von API sein),
viele Dinge auf einmal zu bedenken

Ungepufferte Streams gibts in Java nicht. In C schon.

Hallo nochmal und vielen Dank fuer Eure Antworten

Problem dabei: wenn Java auf Konsole wartet, dann passiert so lange nix, keine Musik weiter,

Genau das ist mein Problem. Das Einlesen funktioniert, das abspielen der Musik ebenfalls (dank zusaetzlicher Bibiotheken). Gibt es da Loesungen?

Ungepufferte Streams gibts in Java nicht. In C schon.

Bedeutet das, dass mein es keine Loesung fuer mein Vorhaben gibt?

So genau kenne ich mich in Java nicht aus, vielleicht gibt es schon ein Framework, in dem Streams direkt durchgehen, ohne Enter zu drücken. Mit Bordmitteln aber nicht.
Vielleicht weiß da ein Anderer mehr.

Tutorials 4 JAVA: Basic Audio Player Using Java

die mehrfach genannten Threads? einer darf ruhig ständig auf die Eingabe warten,
ein anderer kümmert sich die ganze Zeit um die Musik


dass von der Konsole keine einzelnen Tasten, sondern nur ganze Zeilen nach Enter gelesen werden können, ist eine andere Frage,
ob in C besser, wer weiß,
wie reagieren dort Programme auf Eingaben, wenn man in Konsole erst HALO eintippt, ein Zeichen löscht auf HAL, dann zu HALLO weiterschreibt,
dann vielleicht mit Pfeilttaste zurück, im Overwrite-Modus mit einem E den Text zu HELLO ändert und am Ende alles mit Enter absendet?
die Verarbeitung dazu zeichenweise möchte ich sehen :wink:

da lohnt sich doch eher ganze Zeilen einzulesen, hoffentlich ist umschaltbar beides möglich wie auch in GUIs:
für einzelne Zeichen/ Kommandos KeyListener/ KeyBindings,
für komplette Eingaben aber lieber ein Textfeld befüllen lassen und am Ende nachschauen was drinsteht

In C kann man sich das aussuchen, ob einzelne Zeichen oder ganze Zeilen.

Ein Gui behebt das Problem aber auf einfach und elegante Art.