复制ObservableList java
发布时间:2020-12-14 05:17:12 所属栏目:Java 来源:网络整理
导读:我有一个MasterData,它是一个ObservableList和filteredData,它也是一个ObservableList. 然后,我想使用它来显示过滤器数据,当过滤器设置时,也可以在必要时恢复,这里是MCVE: package br;import javafx.collections.FXCollections;import javafx.collections.O
|
我有一个MasterData,它是一个ObservableList和filteredData,它也是一个ObservableList.
然后,我想使用它来显示过滤器数据,当过滤器设置时,也可以在必要时恢复,这里是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();
}
}
类过滤器,我用来过滤数据: 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;
}
}
而Foo类只是一个String Name和一个int bar(加上getter / 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;}
}
当您运行此代码时,您将获得:
当过滤器设置为3(过滤数据如预期)和过滤器“重置”为零后. 如何确保过滤器始终使用masterData中的数据进行处理,然后存储在filteredData上? 注意:这是一个JavaFX项目,所以我真的需要使用ObservableList. 解决方法
问题
public void setData(ObservableList<Foo> data) {
this.data = data;
}
说明 如果您想知道Java遵守Pass By Value,并且masterData的值应该已被复制到列表数据.你是对的 !但是这个故事只是一点点扭曲 原始图像的变化,值被传递,但是对象的对象,对象引用被按值传递. 因此,您正在引用masterData的Object,而不是将值复制到新的List! 解 this.data = FXCollections.observableArrayList(data); 这将创建一个新的对象以供数据引用,所有的操作都将在这个新对象的数据上完成. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
