如何将JavaFX ListView与复杂数据一起使用?

时间:2016-01-18 02:14:45

标签: listview javafx observablelist

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

  1. 我们需要让ListView观察两个名称属性,以便刷新更改。 this answer中解释了实现此目的的一种方法(另请参阅this answer)。但是,这个解决方案需要通过&#34;提取器&#34;到ObservableList的构造函数,我的列表已经存在(作为更大的数据模型的一部分)。有人会认为有一种方法可以包装现有的ObservableList以添加提取器,但我不会在API中看到它。 (嗯,有this method,但它会将列表视为List而不是ObservableList,因此不会报告对原始列表的更新。还this method创建了ObservableList的&#34; synchronized&#34;包装器,但它没有包含一个提取器参数。)也许我应该只实现一个方法来执行此包装自己?

  2. 我们需要在Person中呈现ListView项。我知道如何使用自定义ListCell类来完成此操作,但我希望可能有一种更简单的方法,因为我只显示字符串。依赖Person.toString不是正确的做法,因为我可能有Person的其他观点需要PersonString的不同转换。有没有办法传递ListView<Person>一个Callback<Person,String>(或类似的东西)来将项目转换为字符串?

  3. 所以,最后,我确实有办法做我想做的事情:在1中编写我自己的包装器并在2中使用自定义单元工厂。我觉得这需要我做的工作比应该做的更多我认为是一种相对常见的情况。我错过了一种更容易的方法吗?

1 个答案:

答案 0 :(得分:0)

Setting Up Google Play Services的评论已经回答了这个问题。

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

的内容
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);