为什么在JavaFX中,ReadOnlyXPropety实现了ObservableValue接口

时间:2018-10-19 13:24:16

标签: java javafx

我试图理解JavaFX属性API,并注意到ReadOnlyBooleanProperty,ReadOnlyStringProperty和其他ReadOnlyXPropety类实现了ObservableValue接口。为什么我们需要只读属性的更改侦听器?否则我听不懂...

2 个答案:

答案 0 :(得分:3)

只读属性并不一定意味着该属性的值永远不会改变,只是意味着它不能在外部进行更改。

Worker接口及其抽象实现(例如Task)就是一个例子。 Worker具有各种只读属性,包括:titlemessageprogressvalue等。这些属性旨在传达有关{ {1}}的UI进度。考虑到这一点,允许从外部源修改这些属性没有任何意义。但是它仍然必须提供一种从后台任务修改这些属性的方法。在Task中,这是通过受保护的TaskupdateMessage和其他方法完成的。

在内部,这是通过使用updateProgress类来完成的。这些实现扩展了它们相应的ReadOnlyXXXWrapper类,但是公开了一个专门的SimpleXXXProperty,它是 truly 只读的。 “真正”是指它没有实现WritableValue。看起来像这样:

ReadOnlyXXXProperty

请注意,setter只允许类本身更改属性。对于世界其他地方,该属性是完全只读的。

答案 1 :(得分:1)

ReadOnlyProperty类只是一个包装器,可以(只读)公开。后面的值可能仍会更改。

ReadOnlyObjectWrapper为例。它们通常私下用于值更改,而从ReadOnlyPropertyWrapper#getReadOnlyProperty()返回的属性用于将ObservableProperty公开为只读。