java - 为什么在 JavaFX ReadOnlyXPropety 中实现 ObservableValue 接口
问题描述
我试图了解 JavaFX 属性 API,并注意到 ReadOnlyBooleanProperty、ReadOnlyStringProperty 和其他 ReadOnlyXPropety 类实现了 ObservableValue 接口。为什么我们需要更改只读属性的侦听器?或者我有什么不明白...
解决方案
只读属性并不一定意味着该属性的值永远不会改变,它只是意味着它不能被外部更改。
这方面的一个例子是Worker
接口及其抽象实现,例如Task
. AWorker
具有各种只读属性,包括:title
、message
、progress
、value
等。这些属性旨在将有关Task
的进度信息传达给 UI。考虑到这一点,允许从外部源修改这些属性是没有意义的。但它仍然必须提供一种从后台任务修改这些属性的方法。在Task
中,这是通过 protected updateMessage
、updateProgress
和其他方法完成的。
在内部,这是通过使用ReadOnlyXXXWrapper
类来完成的。这些实现扩展了它们相应的SimpleXXXProperty
类,但公开了一个真正只读的专用ReadOnlyXXXProperty
类。通过“真正”,我的意思是它没有实现. 这看起来像:WritableValue
public class SomeClass {
private final ReadOnlyStringWrapper message = new ReadOnlyStringWrapper(this, "message");
private void setMessage(String message) {
this.message.set(message);
}
public final String getMessage() {
return message.get();
}
public final ReadOnlyStringProperty messageProperty() {
return message.getReadOnlyProperty();
}
}
请注意,setter 只允许类本身更改属性。对于世界其他地方,该属性是完全只读的。
推荐阅读
- java - (Java) Static member accessed via instance reference with enumerators
- javascript - Mongoose get all documents matching array intersection
- reactjs - TextField Label to show separately from input
- css - Is possible to hide the header which includes as an iframe section in squarespace website through css?
- java - 如何使用 Java-11 运行 apache fop?
- java - Hibernate IncompatibleClassChangeError:实现类
- oracle - 在 Oracle 中不计算指数函数和对数函数
- javascript - 获取 ComboBox 值的 Javascript 在 IE11 中有效,但在 Edge 中无效
- php - 如何在 PHP 中单击按钮时向数组添加更多值
- boost - 无法从 VS2019 中的 Boost 属性树映射值中获取值()