为什么 JavaFX table.getItems().clear() 也清除 ObservableList

Why does JavaFX table.getItems().clear() clear the ObservableList as well

我有一个 JavaFX table 定义为:

TableView<Person> table = new TableView<>;
//Person Class contains firstName,lastName & email properties
//table has three columns First Name, Last Name & Email

ObservableListPerson

ObservableList<Person> persons = FXCollections.observableArrayList();

后台服务,其任务是通过向 ObservableList persons 添加条目(Person 个对象)来动态填充 table。

table 绑定为:

table.itemsProperty().bind(service.valueProperty());

一切正常...但我最近发现如果我通过

清除table项
table.getItems().clear();

它不仅清除了table,还清除了ObservableList persons。我想知道这是否是双向绑定? 即使我在 table 上调用 getItems().clear() 之前解除绑定,它也会产生相同的结果。 有人可以解释一下我没有说到这里的意义吗?

当你设置一个TableViewitemsProperty时,你实际上做的是设置存储在属性中的引用(指针)指向指定的ObservableList,而不是制作指定列表的精确副本。

因此,当您调用 getItems 时,它 returns 对指定列表的引用。

因此,如果您在此列表上调用clear(),您将清除原来的ObservableList


注:

在大多数情况下,您所尝试的绑定是不必要的:

table.itemsProperty().bind(service.valueProperty());

并且只需将 itemsProperty 设置为

就足够了
table.setItems(service.valueProperty().get());

仅当您计划 valueProperty 中存储的引用将在运行时指向 另一个列表 时才需要绑定。在大多数情况下,table 收到有关列表更改的通知就足够了。