首页 > 解决方案 > 为什么在 JavaFX ReadOnlyXPropety 中实现 ObservableValue 接口

问题描述

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

标签: javajavafx

解决方案


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

这方面的一个例子是Worker接口及其抽象实现,例如Task. AWorker具有各种只读属性,包括:titlemessageprogressvalue等。这些属性旨在将有关Task的进度信息传达给 UI。考虑到这一点,允许从外部源修改这些属性是没有意义的。但它仍然必须提供一种从后台任务修改这些属性的方法。在Task中,这是通过 protected updateMessageupdateProgress和其他方法完成的。

在内部,这是通过使用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 只允许类本身更改属性。对于世界其他地方,该属性是完全只读的。


推荐阅读