JavaFX ObservableList -- warum funktioniert das so....

fhs14647

Mitglied
Ich beschäftige mich gerade mit der ObservableList und habe ein Übungsbeispiel gefunden.
Das Beispiel funktioniert problemlos, nur weiß ich nicht warum ......

Konkret verstehe ich nicht, warum es zur Ausgabe der Liste im Textfeld folgende Anweisungen braucht, speziell die Anweisung tf.getText() , die ja nur eine leere Zeile bedeutet. Lasse ich tf.getText() weg, wird immer nur die letzte Eintragung angezeigt, warum ????

Vielen Dank im Voraus!!

Java:
tf.setText("");
// Iterator für die beobachtbare Liste
                for (Iterator<String> it = observableList.iterator(); it.hasNext();) {

                    tf.setText(tf.getText() + it.next() + "\n");
                }
            }




Java:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javax.swing.JOptionPane;

/**
*
* @author Mario
*/
public class MyOList extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Erweitere Liste");
        final TextArea tf = new TextArea();
        final Label lb = new Label();
        lb.setText("Größe der Liste: 0");

        final List<String> liste = new ArrayList<>();

// Beobachten der Liste mit ObservableList.
        final ObservableList<String> observableList
                = FXCollections.observableList(liste);
        observableList.addListener(new ListChangeListener() {
            @Override
            public void onChanged(ListChangeListener.Change change) {
                tf.setText("");
// Iterator für die beobachtbare Liste
                for (Iterator<String> it = observableList.iterator(); it.hasNext();) {

                    tf.setText(tf.getText() + it.next() + "\n");
                }
            }
        });
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
// Liste wird erweitert
                String namen = JOptionPane.showInputDialog(null, "Geben Sie einen Namen eine");
                observableList.add(namen);

                lb.setText("Größe der Liste: " + observableList.size());

            }
        });
        VBox root = new VBox();
        root.getChildren().addAll(btn, lb, tf);
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Collection!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 
da steht aber nicht nur getText() sondern
Java:
tf.setText(tf.getText()+ it.next()+"\n");

Hier wird der Inhalt des Textfeldes gesetzt, und zwar wird der "alte" Text mit getText() + der neue Text aus it.next() übernommen und am Ende noch ein Zeilenumbruch mit "\n" gemacht.

Das ist das gleiche wie z.B. bei einem String:
Java:
String s = "";
s = s + "a"; // -> a
s = s + "b" // -> ab
s = s + "c" // -> abc
 
Ah, jetzt habe ich es gecheckt. Ohne tf.getText() würde er immer nur jeden Listeneintrag einfügen und mit dem nächsten Listeneintrag im Textfeld überschreiben. Sehen würde man nur den letzten Listeneintrag, da die anderen Listeneinträge überschrieben wurden.
Habe ich das richtig verstanden??
Vielen Dank für deine Mühe
 

Neue Themen


Zurück
Oben