0

我有一个ObservableList<Person>, 其中 aPersonfirstNamelastName属性(以适当的 JavaFX 方式),我想做一个ListView显示人名并反映列表和列表中各个Person对象的属性的更改。这怎么做最好?有两个问题:

  1. 我们需要ListView观察两个名称属性,以便它可以刷新更改。此答案中解释了一种方法(另请参阅此答案)。但是,此解决方案需要将“提取器”传递给 的构造函数ObservableList,并且我的列表已经存在(作为更大数据模型的一部分)。有人会认为有一种方法可以包装现有的ObservableList以添加提取器,但我在 API 中看不到它。(嗯,有这个方法,但是它将被包装的列表简单地视为 aList而不是 a ObservableList,因此不会报告对原始列表的更新。还有这个方法可以创建一个“同步”包装器ObservableList,但它不包含提取器参数。)也许我应该只实现一种方法来包装自己?

  2. 我们需要Person渲染ListView. 我知道如何使用自定义ListCell类来做到这一点,但我希望可能有一种更简单的方法,因为我只显示字符串。依赖Person.toString不是正确的做法,因为我可能有其他观点Person需要对 to 进行不同的Person转换String。有没有办法通过ListView<Person>a Callback<Person,String>(或等效的东西)将项目转换为字符串?

所以,最后,我确实有办法做我想做的事:在 1 中编写我自己的包装器并在 2 中使用自定义单元工厂。我只是觉得这需要我做的工作比我应该做的更多。 d认为是一种比较普遍的情况。有没有我想念的更简单的方法?

4

1 回答 1

0

这已经在将提取器添加到现有 ObservableList的评论中得到了回答。

使用提取器创建一个新的可观察列表,并将内容双向绑定到现有列表。类似的东西

ListView<Person> listView = new ListView<>();
ObservableList<Person> personList = FXCollections.observableList(person -> 
    new Observable[] {person.firstNameProperty(), person.lastNameProperty()});
Bindings.bindContentBidirectional(model.getPersonList(), personList);
listView.setItems(personList);
于 2016-01-18T02:22:13.987 回答