11

我有一个masterDatawhich 是 anObservableList并且filteredDatawhich 也是一个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 /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;}
}

当你运行这段代码时,你会得到:

啊啊
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
啊啊

当过滤器设置为 3(按预期过滤数据)和过滤器“重置”为零之后。

如何确保始终使用masterData中的数据处理过滤器,然后将其存储在过滤数据上?

注意:这是一个 JavaFX 项目,所以我真的需要使用ObservableList.

4

1 回答 1

15

问题

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

解释

如果您想知道 Java 是否遵循Pass By Value并且masterData的值应该已复制到列表数据中。你是对的 !但是这个故事只是有点曲折!

原语的情况下,值被传递,但在对象的情况下,对象引用通过值传递

因此,您引用的是masterData的 Object ,而不是将值复制到新的 List !

解决方案

this.data = FXCollections.observableArrayList(data);

这将创建一个新对象供数据引用,所有操作都将在这个新对象的数据上完成。

于 2014-06-27T06:06:02.593 回答