2014-06-26 17 views
10

Ben de bir ObservableList bir bir ObservableList olan Anaveri ve filteredData var. Burada MCVE gerekli olduğundaKopya ObservableList java

Sonra ben filtrelenmiş verileri göstermek için filtre ayarlanır, aynı zamanda kurtarmak edebilmek için zaman kullanmak istiyorum:

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(); 
    } 
} 

sınıf I verileri filtrelemek için kullandığımız filtre,: sadece bir dize adı ve bir int bar

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; 
    } 

} 

ve Foo sınıfı, (artı Gett Bu kodu çalıştırdığınızda/ayarlayıcılar) ers

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;} 
} 

, alırsınız:

aa
bb
c

Hem filtre set edildiğinde ila 3 (ki beklenen verileri filtre edilmiş) ve süzme sonrasında sıfıra için "sıfırlandı" idi.

nasıl filtre daima Anaveri verilerle işlem görmüş ve ardından filteredData depolanan emin olabilirim?

Not: bu JavaFX projesi için, yani gerçekten ObservableList kullanmak gerekir.

cevap

12

Sorun Java listeye kopyalanmış olması gereken değeri ve değeri Anaveri By Geçiş uyduğunu merak ediyor halinde

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

Açıklama

veriler. Haklısın ! Ama hikayenin sadece küçük bir twist var! ilkel Örtmek

, değerler geçirilir ama nesnelerin örtmek, Nesne başvuruları değeri tarafından iletilir.

Değerleri yeni bir listeye kopyalamak yerine, masterData'un Nesnesine başvuruyorsunuz!

Bu başvurmak ve tüm manipülasyon en yeni nesnenin verilerine yapılacaktır verilerine için yeni bir Object yaratacak

this.data = FXCollections.observableArrayList(data); 

Çözüm.

+1

Sadece bunun bana yardımcı olduğunu söylemek istedim, çok teşekkürler! FXCollections sınıfı, çoklu örneklerde çok kullanışlıdır! – XaolingBao