【问题标题】:How to use JavaFX ListView with complex data?如何使用 JavaFX ListView 处理复杂数据?
【发布时间】:2016-01-18 02:14:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • @James_D:谢谢!我在搜索中不知何故没有到达那个页面。我今天刚开始接触JavaFX,试图找到这种信息有点令人沮丧......

标签: listview javafx observablelist


【解决方案1】:

这已在 cmets 中回复至Add extractor to existing 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 2021-05-22
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多