如何在 ObservableList 中观察项目的属性变化
How to observe items' properties changes in ObservableList
我正在用 JavaFX 开发一些 Messenger,只是为了更加熟悉这项技术。
Contact
有两个主要属性:User
和最后一个 Message
.
我需要展示
- 包含最新消息的联系人列表
- 按姓名排序的联系人列表
到目前为止我得出了两个解决方案
第一个解决方案 是使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" 函数来告诉列表列表项中的哪些属性应该触发列表更改事件:
这将为您提供与第二个解决方案相同的方法,但您不必自己编写代码来管理侦听器。
我正在用 JavaFX 开发一些 Messenger,只是为了更加熟悉这项技术。
Contact
有两个主要属性:User
和最后一个 Message
.
我需要展示
- 包含最新消息的联系人列表
- 按姓名排序的联系人列表
到目前为止我得出了两个解决方案
第一个解决方案 是使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" 函数来告诉列表列表项中的哪些属性应该触发列表更改事件:
这将为您提供与第二个解决方案相同的方法,但您不必自己编写代码来管理侦听器。