Java 可观察列表不';t更新数组列表

Java 可观察列表不';t更新数组列表,java,javafx,observablelist,Java,Javafx,Observablelist,对于学校作业,我们正在使用JavaFX中的ObservableList对象(对吗?)。我已经在这方面工作了一天多了,现在想不出来了。老师只告诉我们用谷歌搜索,所以也没用 基本上,我们正在开发一个基本的管理应用程序来跟踪人们及其家庭。人们是一个家庭的成员,一个家庭可以有多个成员 当添加个人或家庭时,他们将被添加到observableList中,然后该列表将更新ArrayList(以便可以序列化数据)和GUI元素。这就是问题所在 我们目前有以下实施: private List<Persoon&

对于学校作业,我们正在使用JavaFX中的ObservableList对象(对吗?)。我已经在这方面工作了一天多了,现在想不出来了。老师只告诉我们用谷歌搜索,所以也没用

基本上,我们正在开发一个基本的管理应用程序来跟踪人们及其家庭。人们是一个家庭的成员,一个家庭可以有多个成员

当添加个人或家庭时,他们将被添加到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);
在此之后,当我们检查“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>)