2014-06-26 13 views
10

Tôi có một MasterData là một ObservableList và filterData cũng là một ObservableList.Sao chép ObservableList java

Sau đó, tôi muốn sử dụng nó để hiển thị các dữ liệu đã lọc khi lọc được thiết lập, mà còn để có thể phục hồi bất cứ khi nào cần thiết, đây là 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(); 
    } 
} 

Các bộ lọc lớp, mà tôi sử dụng để lọc dữ liệu:

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

} 

và lớp Foo, mà chỉ là một tên Chuỗi và quầy bar int (cộng gett ERS/setters)

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

Khi bạn chạy mã này, bạn sẽ nhận được:

aa
bb
c

Cả hai khi bộ lọc được thiết lập để 3 (đã lọc dữ liệu như mong đợi) và sau khi bộ lọc là "đã được khôi phục" về không.

Làm thế nào tôi có thể chắc chắn rằng bộ lọc được luôn luôn xử lý với các dữ liệu trong masterData và sau đó lưu trữ trên filteredData?

Lưu ý: đây là một dự án JavaFX, vì vậy tôi thực sự cần sử dụng ObservableList.

Trả lời

12

Vấn đề

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

Giải thích

Trong trường hợp bạn đang tự hỏi rằng Java tuân đèo By Value và giá trị của masterData nên đã được sao chép vào danh dữ liệu. Bạn nói đúng ! Nhưng chỉ có một chút xoắn cho câu chuyện!

Trường hợp của nguyên thủy, các giá trị được chuyển nhưng trong đối tượng, Tham chiếu đối tượng được chuyển theo giá trị.

Vì vậy, bạn đang tham chiếu đến Đối tượng của masterData, thay vì sao chép các giá trị vào Danh sách mới!

Giải pháp

this.data = FXCollections.observableArrayList(data); 

này sẽ tạo ra một đối tượng mới cho dữ liệu để tham khảo và tất cả các thao tác sẽ được thực hiện trên dữ liệu đối tượng mới của này.

+1

Tôi chỉ muốn nói điều này đã giúp tôi, cảm ơn rất nhiều! Lớp FXCollections rất hữu ích trong nhiều trường hợp! – XaolingBao

Các vấn đề liên quan