Cómo recuperar el elemento modificado en una Lista Observable a través de ListChangeListener

Existe el ListChangeListener.Change.wasUpdated()que se usa para detectar cambios dentro de los elementos para ObservableListlos correos electrónicos creados a través de ObservableList.observableArrayList(Callback<E,Observable[]> extractor).

¿Cómo recupero los elementos exactos que causaron que se activara el cambio?

Editar

Tal vez la pregunta no sea lo suficientemente clara, daré un ejemplo.

class Foo {
    private StringProperty name = new SimpleStringProperty();
    public final StringProperty nameProperty() { return name; }
    public final String getName() { return name.get(); }
    public final void setName(String n) { name.set(n); }
    public Foo(String fooName) { setName(fooName); }
}

// Creates an ObservableList with an extractor
ObservableList<Foo> fooList = FXCollections.observableArrayList(foo -> new Observable[] { foo.nameProperty() });
Foo fooA = new Foo("Hello");
Foo fooB = new Foo("Kitty");
fooList.add(fooA);
fooList.add(fooB);

fooList.addListener(new ListChangeListener<Foo>() {
     public void onChanged(Change<Foo> c) {
         while (c.next()) {
            if (c.wasUpdated()) {
                // One or more of the elements in list has/have an internal change, but I have no idea which element(s)!
            }
        }
    }
});

fooB.setName("Mickey");

fooB.setName()activará un cambio en el ListChangeListener, que la wasUpdated()condición volvería true. Sin embargo, no tengo forma de saber que es lo fooBque ha cambiado dentro del oyente.

Esto puede parecer trivial, pero tengo una aplicación de mapas donde la lista almacena las cosas que el mapa tiene que representar. Cuando uno de los elementos cambia su posición (es decir, lat / long), necesito volver a trazar en el mapa. Si no tengo idea de qué elemento ha cambiado de ubicación, tendré que volver a dibujar todo lo que ya tengo.

Respuesta 1

Puede obtener el (los) índice (es) de los elementos que se modificaron, lo que le brinda información útil:

import javafx.beans.Observable;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener.Change;
import javafx.collections.ObservableList;

public class ListUpdateTest {

    public static void main(String[] args) {

        ObservableList<Foo> fooList = FXCollections.observableArrayList(foo -> new Observable[] { foo.nameProperty() });
        Foo fooA = new Foo("Hello");
        Foo fooB = new Foo("Kitty");
        fooList.add(fooA);
        fooList.add(fooB);

        fooList.addListener((Change<? extends Foo> c) -> {
             while (c.next()) {
                if (c.wasUpdated()) {
                    int start = c.getFrom() ;
                    int end = c.getTo() ;
                    for (int i = start ; i < end ; i++) {
                        System.out.println("Element at position "+i+" was updated to: " +c.getList().get(i).getName() );
                    }
                }
            }
        });

        fooB.setName("Mickey");
    }

    public static class Foo {
        private StringProperty name = new SimpleStringProperty();
        public final StringProperty nameProperty() { return name; }
        public final String getName() { return name.get(); }
        public final void setName(String n) { name.set(n); }
        public Foo(String fooName) { setName(fooName); }
    }
}

Tenga en cuenta que, desde el evento de cambio de lista, no puede determinar las propiedades reales que cambiaron en esos elementos de la lista (por lo tanto, si su extractor señaló dos o más propiedades, no hay forma de encontrar cuáles de esas propiedades cambiaron), y no hay forma de obtener el valor anterior. Sin embargo, esto puede ser suficiente para su caso de uso.

Respuesta: 2

Tengo un problema que probablemente esté relacionado con la relación Spring / class loader. Me disculparé por la verbosidad de la pregunta ahora. Tengo varias aplicaciones de Java heredadas que ...

Estoy tratando de desarrollar una aplicación Spring MVC con páginas JSP y me he encontrado con un problema. Es más un problema de creatividad que un problema de código, pero aquí va: la aplicación básicamente recibe ...

Si está definiendo una variable, parece ser perfectamente válido declarar / definir una variable de la siguiente manera: double [] [] output = {{0,0}, {1,0}}; Pero si devuelve un valor, parece ser ...

He leído (http://old.nabble.com/using-q%3D--,-adding-fq%3D-to26753938.html#a26805204): FWIW: limitar el número de filas por solicitud a 50, pero no limitar el comienzo no hace mucho ...