JavaFX - 监听列表中的变化

Iva*_*son 2 javafx arraylist changelistener

嗨,我有一个可能很愚蠢的问题。我刚刚开始玩弄 PropertiesChangeListeners 但遇到了减速带。我明白,如果我制作一个ObjectProperty包含ArrayListany 的对象ChangeListener,则只有在其本身发生变化时才会触发ArrayList。不过我希望所有的ChangeListeners 都能开火,如果

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

JavaFX 中是否已经有一些功能可以实现此目的,或者我应该手动实现此功能?最好的方法是什么?

/谢谢你的帮助!

Zep*_*hyr 8

您无法将侦听器添加到常规中,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");
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用更多方法来ListChangeListener获取有关更改内容的更多详细信息。仔细阅读一下吧!