Java 可观察列表不';t更新数组列表
对于学校作业,我们正在使用JavaFX中的ObservableList对象(对吗?)。我已经在这方面工作了一天多了,现在想不出来了。老师只告诉我们用谷歌搜索,所以也没用 基本上,我们正在开发一个基本的管理应用程序来跟踪人们及其家庭。人们是一个家庭的成员,一个家庭可以有多个成员 当添加个人或家庭时,他们将被添加到observableList中,然后该列表将更新ArrayList(以便可以序列化数据)和GUI元素。这就是问题所在 我们目前有以下实施:Java 可观察列表不';t更新数组列表,java,javafx,observablelist,Java,Javafx,Observablelist,对于学校作业,我们正在使用JavaFX中的ObservableList对象(对吗?)。我已经在这方面工作了一天多了,现在想不出来了。老师只告诉我们用谷歌搜索,所以也没用 基本上,我们正在开发一个基本的管理应用程序来跟踪人们及其家庭。人们是一个家庭的成员,一个家庭可以有多个成员 当添加个人或家庭时,他们将被添加到observableList中,然后该列表将更新ArrayList(以便可以序列化数据)和GUI元素。这就是问题所在 我们目前有以下实施: private List<Persoon&
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);
在此之后,当我们检查“personen”列表时,添加的对象不存在:(
我们是否遗漏了一些明显的内容?您需要使用而不是
根据可观察列表的文档
:
构造由指定列表支持的ObservableList
因此,可观察列表的任何修改都将报告给支持列表。但是,在可观察列表
的情况下:
创建一个新的可观察数组列表,并向其中添加集合col的内容
所以这个列表不受给定列表的支持,它只是作为一个初始集合
作为旁注,您不应该调用
notifyAll()
:此方法与JavaFX无关,它与唤醒等待此对象的线程有关。示例说明如何将数组列表
同步到可观察列表
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);
}
}
尝试一下这段代码对我来说很有用: 这里的
old_list
是observearraylist
//更新新的更改
旧地图{
//做你的改变
}
val templast=old_list.clone()//创建一个克隆
old_list.clear()//清除旧列表
旧列表.addAll(作为可观察的列表的圣殿骑士)
我认为你没有理解可观察列表的概念。是否更新personen
与它是可观察列表这一事实无关,而是与它是否由personen
支持有关,而在你的代码中,使用可观察列表
,则与此无关。对的调用e> notifyAll
是不相关的。另一种方法(可能更好,tbh)在JavaFX observable properties和observable collections中序列化数据是通过readObject
和writeObject
方法定义自定义序列化表单,而不是试图保留所有列表和属性的双重副本。当我这样做并向observableList添加一些内容时,我会得到一个非法的MonitorStateException运行notifyAll()时在observableList上。@cascer1请看我的编辑,您不应该调用notifyAll,因为这与JavaFX无关。您假设对observableList
的唯一更改是将元素添加到列表的末尾?@James_D说实话,此赋值的一个怪癖确实是只会添加项,而不会删除项这是一个非常简单的演示-是的。显然,代码应该进行修改,以处理未放在列表末尾的元素的删除或添加。处理observableList.addAll(1.0,2.0,1.0);observableList.remove(2);
(后一条语句删除索引2
处的元素,而不是值为2的元素)这几乎是不可能的,除非您每次都建议重建列表。ListChangeListener.Change
API只是没有提供足够的功能来处理所有情况。@James\D,Java 8 ListChangeListener.Change API()为信令元素的添加、排列、移除、替换和更新提供支持。它似乎很完整。为什么你认为它们不可能处理?
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
//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>)