Veränderungen einer ObservableList

Plauzi92

Aktives Mitglied
Hey Leute,

ich versuche gerade eine ObservableList mit ChangeListener zu implementieren. Die Liste "ListOfObjects" bekommt nach jeder halben Sekunde ein neues Objekt über einen Timer.

Code:
import java.util.Timer;
import java.util.TimerTask;

public class NeuerTimer {

    Timer timer;

    public NeuerTimer() {
        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {

                 TestObjekt Objekt = new TestObjekt("TestName");

                TestListe.ListOfObjects.add(Objekt);

            }
        }, 10, 500);

    }

}

Die Objekte sind derzeit nur Testobjekte die nur einen Namen haben:
Code:
public class TestObjekt {
    private String name;

    public TestObjekt(String name) {
        this.setName(name);

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Die Klasse "TestListe" hat einen ChangeListener der mich über Änderungen informieren soll.
Code:
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;

public class TestListe {

    static ObservableList<TestObjekt> ListOfObjects = FXCollections.observableArrayList();

    public static void main(String[] args) {

        new NeuerTimer();

        ListOfObjects.addListener(new ListChangeListener<TestObjekt>() {

            @Override
            public void onChanged(Change<? extends TestObjekt> arg0) {

                System.out.println(arg0);

            }

        });

    }

}

Die Änderungen teilt er mir über den Ausgabebefehl zwar mit, aber nur in der Form { [TestObjekt@641bd0a2] added at 4 }:

Dass das Objekt nicht einfach so als String ausgegeben werden kann ist mir klar, aber wie kann ich auf die Werte des Objekts direkt zugreifen?
Ich hab mir auch überlegt den Ausgabewert zu splitten, das letzte Element (was ja der Index ist) in ein Integer zu schreiben, damit die Liste zu durchsuchen und dann auf das Objekt zuzugreifen. Das kann aber doch nicht die Lösung sein.
Gibt es eine Methode die mir nur den Index oder nur die Werte des Elements (bzw das Element selbst) ausgibt welches sich ändert, oder geht es tatsächlich nur über einen Split?

Danke im Voraus und LG 🙂

Edit: Hatte überlegt das Thema im JavaFX Bereich zu erstellen aber es ist ja dann doch auch ein Basic Thema 😀
 
Das hatte ich auch schon probiert. Ehrlich gesagt hab ich fast alle Methoden probiert die arg0 hat 😀

Da wird allerdings eine Exception geworfen:
Exception in thread "Timer-0" java.lang.IllegalStateException: Invalid Change state: next() must be called before inspecting the Change.
at javafx.base/javafx.collections.ListChangeBuilder$SingleChange.checkState(ListChangeBuilder.java:618)
at javafx.base/javafx.collections.ListChangeBuilder$SingleChange.getPermutation(ListChangeBuilder.java:606)
at javafx.base/javafx.collections.ListChangeListener$Change.wasPermutated(ListChangeListener.java:179)
at javafx.base/javafx.collections.ListChangeListener$Change.wasAdded(ListChangeListener.java:188)
at javafx.base/javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:243)
at TestListe$1.onChanged(TestListe.java:22)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.base/javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
at NeuerTimer$1.run(NeuerTimer.java:18)
at java.base/java.util.TimerThread.mainLoop(Timer.java:556)
at java.base/java.util.TimerThread.run(Timer.java:506)
 
Okay, hab eine Lösung für die Exception gefunden:

Code:
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;

public class TestListe {

    static ObservableList<TestObjekt> ListOfObjects = FXCollections.observableArrayList();

    public static void main(String[] args) {

        new NeuerTimer();

        ListOfObjects.addListener(new ListChangeListener<TestObjekt>() {

            @Override
            public void onChanged(Change<? extends TestObjekt> arg0) {

                while (arg0.next()) {

                    if (arg0.wasAdded()) {

                        System.out.println(arg0.getAddedSubList());

                    }

                }

            }

        });

    }

}

Auf das Objekt zugreifen kann ich aber immernoch nicht.
 
Hat sich erledigt:
Code:
System.out.println(arg0.getAddedSubList().get(0).getName());

Vielen Dank! 😀
 
Gibt es eigentlich auch die Option über Veränderungen der Elemente selbst informiert zu werden? Also wenn sich zum Beispiel der Name des Objekts ändert? Ich hab gelesen, dass man dafür SimpleStringProperties braucht. Hab mein Projekt dahingehend verändert und die Benachrichtigung beim hinzufügen oder entfernen klappt auch noch. Für die Veränderungen der Objekte selbst finde ich allerdings nicht die passende Methode..
 

Neue Themen


Zurück
Oben