2014-11-10 2 views
9

Ho davvero difficoltà a capire come funziona l'oggetto ObservableList in JavaFX. Voglio monitorare se un oggetto nella lista è stato modificato. Finora, vedo solo che posso controllare se la lista, come entità in sé, è stata modificata ... ma non gli oggetti all'interno della lista:Come monitorare le modifiche sugli oggetti contenuti in una ObservableList JavaFX

private ObservableList<Stuff> myList = FXCollections.<Stuff>observableArrayList(); 

    myList.addListener((ListChangeListener.Change<? extends Stuff> change) -> { 
     while(change.next()){ 
      if(change.wasUpdated()){ 
       System.out.println("Update detected"); 
      } 
      else if(change.wasPermutated()){ 

      } 
      else{ 
       for (Stuff remitem : change.getRemoved()) { 
        //do things 
       } 
       for (Stuff additem : change.getAddedSubList()) { 
        //do things 
       } 

      } 
     } 
    }); 

c'è un modo per fare questo. Sto cercando un flusso di lavoro di eventi come la modifica sui trigger degli oggetti => modifica sui trigger di lista => aggiorna su una vista che ha l'elenco come fonte primaria.

Grazie

+2

possibile duplicato di [Java 8: Elenco osservabile: listener di invalidazione o listener di modifiche viene chiamato in caso di modifica della proprietà] (http://stackoverflow.com/questions/26730034/java-8-observable-list-invalidation-listener -nor-change-listener-is-called-in) –

+2

Vedere anche questo post del blog: [Proprietà Extractor: il modo migliore per ottenere ListView aggiornando istantaneamente i suoi elementi] (http://www.jensd.de/wordpress/?p = 1650) –

risposta

3

Se si desidera monitorare i cambiamenti degli oggetti all'interno della lista invece di lista stessa, allora dovete collegare ascoltatori agli oggetti della lista e non alla lista.

Naturalmente per essere in grado di farlo, gli oggetti devono supportare questo. java.lang.Object non supporta questo.

Invece dare un'occhiata all'interfaccia ObservableValue. Gli oggetti che implementano questa interfaccia supportano questo tipo di monitoraggio che stai cercando. La pagina javadoc di ObservableValue elenca tutte le classi integrate JavaFX che implementano questa interfaccia (l'elenco è abbastanza lento).

O si deve utilizzare uno di questi, oppure è necessario implementare l'interfaccia da soli. E aggiungi i tuoi ascoltatori di cambiamenti agli oggetti e non alla lista.

+5

Esiste già un'API per fare ciò: consultare http://stackoverflow.com/questions/26730034/java-8-observable-list-invalidation-listener-nor-change-listener-is-called-in/26734379 # 26734379 –

3
public static void main(String[] args) { 
    ArrayList<Integer> intList = new ArrayList(); 
    intList.add(0); 
    intList.add(1); 

    ObservableList<Integer> ob = FXCollections.observableArrayList(intList); 
    ob.addListener(new ListChangeListener<Integer>() { 
     @Override 
     public void onChanged(javafx.collections.ListChangeListener.Change<? extends Integer> c) { 
      System.out.println("Changed on " + c); 
      if(c.next()){ 
       System.out.println(c.getFrom()); 
      } 

     } 

    }); 

    ob.set(0, 1); 
} 

L'evento (c nel mio caso) è l'indice che il cambiamento si è verificato il (quando si fa .getFrom()). Inoltre, se stampi l'evento, ottieni una stringa che ti dice esattamente cosa è successo. Per errore interpreti, un cambiamento viene fatto nella lista nel suo insieme!