如何在 ObservableList 中观察项目的属性变化

How to observe items' properties changes in ObservableList

我正在用 JavaFX 开发一些 Messenger,只是为了更加熟悉这项技术。

Contact 有两个主要属性:User 和最后一个 Message.

我需要展示

  1. 包含最新消息的联系人列表
  2. 按姓名排序的联系人列表

到目前为止我得出了两个解决方案

第一个解决方案 是使Contact 不可变。因此需要在每次有新消息到达或用户信息发生变化时更换联系人。它有效,但更新时在 ListView 中联系 闪烁

第二种解决方案是使用ObjectProperty:

public class Contact {
    private final ObjectProperty<User> user = ...; 
    private final ObjectProperty<Message> lastMessage = ...; 
}

在那种情况下,当 Contact 是 added/removed to/from 列表时,我必须创建自定义 ObservableList 以 add/remove 听众 Contact 的属性。这是必需的,因为两个列表都应该自动排序。

所以这两种解决方案都有缺点。

请就如何实现我的目标提出建议。

FXCollections class 中,有一种方法使用 "extractor" 函数来告诉列表列表项中的哪些属性应该触发列表更改事件:

https://docs.oracle.com/javase/8/javafx/api/javafx/collections/FXCollections.html#observableArrayList-javafx.util.Callback-

这将为您提供与第二个解决方案相同的方法,但您不必自己编写代码来管理侦听器。