Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden

mrT

Mitglied
Hallo,
vielleicht kann mir jemand helfen. Es geht um ein Trainingsprogramm für die Vokabelabfrage
Ich habe eine ObservableList mit Vokabelobjekten, die nacheinander abgefragt werden sollen. Sobald der User die Übersetzung in ein Textfeld eingibt und ENTER drückt, soll die nächste Vokabel abgefragt werden, bis alle Vokabeln in der Liste einmal dran waren.

Ich habe zwar eine Lösung für mich gefunden, kann mir aber vorstellen, dass das besser geht --meine Lösung: mit while(OL nicht leer) aus OL nacheinander Elemente entnehmen und dann entfernen bis OL leer ist.

Kann man beim Durchlaufen einer Schleife nach jedem Element stoppen und auf Eingabe des Users warten und dann zum nächsten Element weiter gehen?

Das kann eine for-Schleife sein oder wenn möglich auch mit stream()

Also in etwa so:

Java:
   olvokabeln.stream().forEach(vokabel -> {
     
       label.setText(vokabel.getEnglisch());
     
      ///   hier auf EINGABE   warten  und dann weiter die Schleife durchlaufen
     
     
   });

Danke
 
Zuletzt bearbeitet:
Wenn ich mal von einer Klasse Vokabel ausgehe, die eine ... Vokabel ... repräsentiert, könnte man über folgendes nachdenken:

Java:
public class Vokabeln {
    private final List<Vokabel> vokabelListe;
    private final SimpleObjectProperty<Vokabel> aktuelleVokabel = new SimpleObjectProperty<>();
    private int index;

    public Vokabeln(List<Vokabel> vokabeln) {
        vokabelListe = vokabeln;
    }

    public void next() {
        index = (index + 1) % vokabelListe.size();
        aktuelleVokabel.set(vokabelListe.get(index));
    }

    public ReadOnlyProperty<Vokabel> aktuelleVokabelProperty() {
        return aktuelleVokabel;
    }
}

Das UI registriert nun einfach einen Listener bei der Property, die von Vokabeln#aktuelleVokabelProperty() geliefert wird, um die aktuelle Vokabel anzuzeigen und ruft nach einer Eingabe einfach Vokabeln#next() auf. Fertig.

Natürlich ist das nur eine Skizze, die entsprechend angepasst und erweitert werden muss. Beispielsweise fängt next() wieder von vorne an, wenn die letzte Vokabel der Vokabelliste erreicht wurde.
 
Was ich so verstanden habe: Du denkst noch in der Art, wie man bei Konsolenprogrammen denkt. Du bist aber jetzt dabei eine UI zu schreiben und da ändert sich das Vorgehen etwas.

Bei den Programmen mit der UI ist es so (egal ob AWT/Swing, JavaFX oder SWT), dass Du auf Events reagierst. Du steuerst also den Ablauf nicht mehr aktiv sondern reagierst nur noch auf Events, die der User veranlasst.

Du hast also einen Satz an Daten, auf denen Du dann bei Events etwas machst. Das kann dann so aussehen:
  • Du hast z.B. eine Liste von allen Vokabeln, die eingelesen werden beim Programmstart
  • Dann hast Du in dem Programm eine Liste an Vokabeln, die abgefragt werden sollen.
  • Beim Anzeigen wird dann eine Vokabel aus der Liste genommen und entfernt. Diese Vokabel wird dann angezeigt und der Benutzer kann darauf basierend etwas machen.

Der Benutzer hat dann die volle Kontrolle. Er kann das Programm schließen. Oder er kann die Vokabel bearbeiten. Wenn er da etwas gemacht hat, dann kann darauf reagiert werden. Dann wird ggf. die nächste Variable aus dem Vorrat genommen und angezeigt oder so.

Was du Dir also überlegst ist weniger ein Ablaufplan eines Programmes sondern mehr sowas wie eine State Machine. Du hast einen State, der gewisse Dinge enthält und dann können Events passieren. Diese verändern den State dann. Das kann man also etwas als "Event based programming" ansehen.

Du hast somit keine wirkliche Schleife in dem Sinne. Die Schleife besteht dann nur darin, dass der Benutzer Variable nach Variable abarbeiten kann (so er das möchte, evtl. hat er auch andere Möglichkeiten ... eine wäre z.B. das Schließen des Programmes.)
 
Hallo,
danke für die Antworten
@KonradN Das Denken in den Konsolenprogrammen stimmt genau, in den 80ern habe ich mit Basic und Pascal angefangen. Da gab es speziell eine Schleife für Data und mit nextData (o.ä) konnt konnte man schrittweise die Datenmenge durchlaufen.
Aber ich verstehe das Prinzip. Danke

@mihe7 Das mit der ObjektProperty ist ja ein guter Trick, wäre ich nicht darauf gekommen, ist auch ganz praktisch in anderen Situationen.
Danke dann kann ich meine alte Lösung auf jeden Fall verbessern ud übersichtlicher gestalten

Grüße mrT
 

Zurück
Oben