ObservableList 不更新 ArrayList
ObservableList doesn't update ArrayList
对于一项学校作业,我们正在使用 JavaFX 中的 ObservableList 对象(对吧?)。我已经为此工作了一天多,但无法弄清楚。老师只叫我们'Google it' 所以也没用..
基本上,我们正在开发一个基本的管理应用程序来跟踪人们及其家人。每个人都是一个家庭的成员,一个家庭可以有多个成员。
当一个人或家庭被添加时,他们被添加到一个 observableList 中,应该 然后更新一个 ArrayList(这样数据就可以被序列化)和一个 GUI 元素。这就是问题所在。
我们目前有以下实现:
private List<Persoon> personen;
private List<Gezin> gezinnen;
this.personen = new ArrayList<Persoon>();
this.gezinnen = new ArrayList<Gezin>();
private transient ObservableList<Persoon> observablePersonen;
private transient ObservableList<Gezin> observableGezinnen;
observablePersonen = FXCollections.observableArrayList(personen);
observableGezinnen = FXCollections.observableArrayList(gezinnen);
然后在添加项目时,我们执行以下操作:
Persoon p = new Persoon();
observablePersonen.add(p);
observablePersonen.notifyAll();
在此之后,当我们检查 'personen' 列表时,添加的对象不存在 :(
我们是否遗漏了一些明显的东西?
您需要使用FXCollections.observableList
instead of FXCollections.observableArrayList
。
根据 observableList
的文档:
Constructs an ObservableList that is backed by the specified list.
因此,可观察列表的任何修改都将报告给支持列表。但是,在 observableArrayList
:
的情况下
Creates a new observable array list and adds a content of collection col to it.
所以这个列表不受给定列表的支持,它只是作为一个初始集合。
附带说明一下,您不应该调用 notifyAll()
:此方法与 JavaFX 无关,它与唤醒等待此对象的线程有关。
如何将 ArrayList
同步到 ObservableList
的示例。
public class Main {
public static ArrayList<Double> arrayList = new ArrayList();
public static ObservableList<Double> observableList = FXCollections.observableArrayList();
public static void main(String[] args) {
// add a listener to the ObservableList
observableList.addListener(new ListChangeListener<Double>() {
@Override
public void onChanged(Change<? extends Double> c) {
// c represents the changed element
System.out.println("Added " + c + " to the Observablelist");
// we add the last element added to the observable list to the arraylist
arrayList.add(observableList.get(observableList.size()-1));
System.out.println("Added " + arrayList.get(arrayList.size()-1) + " to the Arraylist");
}
});
observableList.add(5.0);
observableList.add(7.0);
}
}
输出:
Added { [5.0] added at 0 } to the Observablelist
Added 5.0 to the Arraylist
Added { [7.0] added at 1 } to the Observablelist
Added 7.0 to the Arraylist
一旦尝试此代码,它对我有用:
这里 old_list
是 ObservableArrayList<CustomType>
的类型
//update new changes
old_list.map{
//do your changes
}
val templist=old_list.clone() // make a clone
old_list.clear() //clear old list
old_list.addAll(templist as ObservableArrayList<CustomType>)
对于一项学校作业,我们正在使用 JavaFX 中的 ObservableList 对象(对吧?)。我已经为此工作了一天多,但无法弄清楚。老师只叫我们'Google it' 所以也没用..
基本上,我们正在开发一个基本的管理应用程序来跟踪人们及其家人。每个人都是一个家庭的成员,一个家庭可以有多个成员。
当一个人或家庭被添加时,他们被添加到一个 observableList 中,应该 然后更新一个 ArrayList(这样数据就可以被序列化)和一个 GUI 元素。这就是问题所在。
我们目前有以下实现:
private List<Persoon> personen;
private List<Gezin> gezinnen;
this.personen = new ArrayList<Persoon>();
this.gezinnen = new ArrayList<Gezin>();
private transient ObservableList<Persoon> observablePersonen;
private transient ObservableList<Gezin> observableGezinnen;
observablePersonen = FXCollections.observableArrayList(personen);
observableGezinnen = FXCollections.observableArrayList(gezinnen);
然后在添加项目时,我们执行以下操作:
Persoon p = new Persoon();
observablePersonen.add(p);
observablePersonen.notifyAll();
在此之后,当我们检查 'personen' 列表时,添加的对象不存在 :(
我们是否遗漏了一些明显的东西?
您需要使用FXCollections.observableList
instead of FXCollections.observableArrayList
。
根据 observableList
的文档:
Constructs an ObservableList that is backed by the specified list.
因此,可观察列表的任何修改都将报告给支持列表。但是,在 observableArrayList
:
Creates a new observable array list and adds a content of collection col to it.
所以这个列表不受给定列表的支持,它只是作为一个初始集合。
附带说明一下,您不应该调用 notifyAll()
:此方法与 JavaFX 无关,它与唤醒等待此对象的线程有关。
如何将 ArrayList
同步到 ObservableList
的示例。
public class Main {
public static ArrayList<Double> arrayList = new ArrayList();
public static ObservableList<Double> observableList = FXCollections.observableArrayList();
public static void main(String[] args) {
// add a listener to the ObservableList
observableList.addListener(new ListChangeListener<Double>() {
@Override
public void onChanged(Change<? extends Double> c) {
// c represents the changed element
System.out.println("Added " + c + " to the Observablelist");
// we add the last element added to the observable list to the arraylist
arrayList.add(observableList.get(observableList.size()-1));
System.out.println("Added " + arrayList.get(arrayList.size()-1) + " to the Arraylist");
}
});
observableList.add(5.0);
observableList.add(7.0);
}
}
输出:
Added { [5.0] added at 0 } to the Observablelist
Added 5.0 to the Arraylist
Added { [7.0] added at 1 } to the Observablelist
Added 7.0 to the Arraylist
一旦尝试此代码,它对我有用:
这里 old_list
是 ObservableArrayList<CustomType>
//update new changes
old_list.map{
//do your changes
}
val templist=old_list.clone() // make a clone
old_list.clear() //clear old list
old_list.addAll(templist as ObservableArrayList<CustomType>)