JavaFX - 监听列表中的变化

JavaFX - Listen to Changes in List

嗨,我有一个可能很愚蠢的问题。我刚开始玩 PropertiesChangeListeners 但遇到了减速带。我明白如果我制作一个包含 ArrayListObjectProperty 任何 ChangeListener 只会在 ArrayList 本身发生变化时触发。但是,如果

,我希望所有 ChangeListener 都触发
  1. ArrayList本身发生了变化。
  2. ArrayList 的长度发生变化(即添加或删除元素)。
  3. ArrayList 中的一个元素被更改为另一个元素。
  4. ArrayList 中的一个元素发生变化,即元素的内容发生变化(例如,如果该元素是自定义 class Person。我想触发 ChangeListener 如果这个人改变了她的年龄。)。

JavaFX 中是否已经有一些功能,或者我应该手动实现它?执行此操作的最佳方法是什么?

/感谢您的帮助!

您不能向常规 ArrayList 添加侦听器,因为它不可观察。然而,FXCollections 包确实提供了一个 ObservableArrayList<E> 允许你监听变化。

这是一个演示程序:

import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;

public class Main {

    public static void main(String[] args) {
        ObservableList<String> strings = FXCollections.observableArrayList();

        strings.addAll("One", "Two", "Three");

        strings.addListener((ListChangeListener<String>) change -> {
            while (change.next()) {
                if (change.wasAdded()) {
                    System.out.println(change.getAddedSubList().get(0)
                            + " was added to the list!");
                } else if (change.wasRemoved()) {
                    System.out.println(change.getRemoved().get(0)
                            + " was removed from the list!");
                }
            }
        });

        strings.add("Dogs");
        strings.remove("Two");
    }
}

ListChangeListener 中有更多方法可用于获取有关已更改内容的更多详细信息。仔细阅读吧!