我试图理解JavaFX属性API,并注意到ReadOnlyBooleanProperty,ReadOnlyStringProperty和其他ReadOnlyXPropety类实现了ObservableValue接口。为什么我们需要只读属性的更改侦听器?否则我听不懂...
答案 0 :(得分:3)
只读属性并不一定意味着该属性的值永远不会改变,只是意味着它不能在外部进行更改。
Worker
接口及其抽象实现(例如Task
)就是一个例子。 Worker
具有各种只读属性,包括:title
,message
,progress
,value
等。这些属性旨在传达有关{ {1}}的UI进度。考虑到这一点,允许从外部源修改这些属性没有任何意义。但是它仍然必须提供一种从后台任务修改这些属性的方法。在Task
中,这是通过受保护的Task
,updateMessage
和其他方法完成的。
在内部,这是通过使用updateProgress
类来完成的。这些实现扩展了它们相应的ReadOnlyXXXWrapper
类,但是公开了一个专门的SimpleXXXProperty
,它是 truly 只读的。 “真正”是指它没有实现WritableValue
。看起来像这样:
ReadOnlyXXXProperty
请注意,setter只允许类本身更改属性。对于世界其他地方,该属性是完全只读的。
答案 1 :(得分:1)
ReadOnlyProperty
类只是一个包装器,可以(只读)公开。后面的值可能仍会更改。
以ReadOnlyObjectWrapper
为例。它们通常私下用于值更改,而从ReadOnlyPropertyWrapper#getReadOnlyProperty()
返回的属性用于将ObservableProperty
公开为只读。