2014-06-26 10 views
10

Ho un MasterData che è una ObservableList e FilteredData che è anche una ObservableList.Copia ObservableList java

Poi, voglio usarlo per mostrare i dati filtrati quando il filtro è impostato, ma anche di essere in grado di recuperare quando necessario, ecco il MCVE:

package br; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

public class Main{ 
    private static ObservableList<Foo> masterData = FXCollections.observableArrayList(); 
    private static ObservableList<Foo> filteredData = FXCollections.observableArrayList(); 
    static Filter filter = new Filter(); 
    public static void addDummy(){ 
     masterData.add(new Foo("a",1)); 
     masterData.add(new Foo("aa",3)); 
     masterData.add(new Foo("b",2)); 
     masterData.add(new Foo("bb",4)); 
     masterData.add(new Foo("c",3)); 
    } 
    public static void printData(ObservableList<Foo> list){ 
     for(Foo f: list) System.out.println(f.getName()); 
    } 
    public static void main(String[] args) { 
     addDummy(); 
     applyFilter(3); 
     printData(filteredData); 
     applyFilter(0); 
     printData(filteredData); 
    } 
    public static void applyFilter(int num){ 
     filter.setData(masterData); 
     filter.setFilter(num); 
     filteredData = filter.getData(); 
    } 
} 

Il Filtro classe, che io uso per filtrare i dati:

package br; 

import java.util.ArrayList; 
import java.util.List; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

public class Filter { 
    private ObservableList<Foo> data = FXCollections.observableArrayList(); 
    public void setFilter(int filter){ 
     List<Foo> copy = new ArrayList<Foo>(data); 
     for(Foo f: copy) 
      if(f.getBar()<filter) data.remove(f); 
    } 
    public ObservableList<Foo> getData() { 
     return data; 
    } 

    public void setData(ObservableList<Foo> data) { 
     this.data = data; 
    } 

} 

e la classe Foo, che è solo un nome di stringa e un bar int (più gett ERS/setter)

package br; 

public class Foo { 
    private String name; 
    private int bar; 
    public Foo(String name, int bar){ 
     this.setBar(bar); 
     this.setName(name); 
    } 
    public String getName() {return name;} 
    public void setName(String name) {this.name = name;} 
    public int getBar() {return bar;} 
    public void setBar(int bar) {this.bar = bar;} 
} 

Quando si esegue questo codice, si otterrà:

aa
bb
c

sia quando il filtro è stato impostato su 3 (che ha filtrato i dati come previsto) e dopo che il filtro è stato "azzerato" a zero.

Come posso assicurarsi che il filtro sia sempre lavorato con i dati nel masterData e quindi memorizzato sul filteredData?

Nota: questo è per un progetto JavaFX, quindi ho davvero bisogno di usare ObservableList.

risposta

12

Problema

public void setData(ObservableList<Foo> data) { 
    this.data = data; 
} 

Spiegazione

Nel caso vi state chiedendo che Java obbedisce passaggio per valore e il valore di masterData avrebbe dovuto essere copiati nella lista dati. Hai ragione ! Ma c'è solo una piccola svolta nella storia!

Incase di primitive, i valori vengono passati, ma in caso di oggetti, riferimenti agli oggetti sono passati per valore.

Quindi, si fa riferimento all'oggetto del masterData, invece di copiare i valori in una nuova lista!

Soluzione

this.data = FXCollections.observableArrayList(data); 

Questo creerà un nuovo oggetto per dati di riferimento e tutte le manipolazioni sia fatta la volontà di dati di questo nuovo oggetto.

+1

Volevo solo dire che questo mi ha aiutato, grazie mille! La classe FXCollections è molto utile in più istanze! – XaolingBao