JavaFX bean 与属性——为什么两者都有?

JavaFX beans vs. properties -- why both?

我正在看http://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/SimpleObjectProperty.html,我有点困惑。

我可以使用第三个构造函数

创建 SimpleObjectProperty
SimpleObjectProperty(Object bean, String name, T initialValue) 

在Clojure中如下:(def sop (SimpleObjectProperty. 5 "mysop" 6))

这将创建一个 SimpleObjectProperty,Bean 值 = 5(类型 java.lang.Long),非 Bean 值 = 6,类型也为 (java.lang.Long)

为什么有两个不同的"values"? "Bean" 在这种情况下的目的是什么?我应该使用哪一个?我正在尝试封装一个通用的 Clojure 对象,我可以在其上设置监听器,所以我认为它要么是这个,要么是 ObjectPropertyBase,它是层次结构中的一个,也可以直接实例化。

我一直在根据需要慢慢吸收 Java 以了解如何在 Clojure 中使用 JavaFX,但是这个令人困惑。

谢谢! :)

"bean" 是 ObjectProperty 是 属性 的对象(换句话说,"owns" 是 Java 对象对象属性)。见 documentation here.

如果您使用多个来源的属性注册了更改侦听器,并且希望能够区分状态已更改的对象,这将很有用:

ChangeListener<Object> listener = (observable, oldValue, newValue) -> {
    ObjectProperty objProp = (ObjectProperty) observable ;
    Object bean = objProp.getBean();
    // do something....
};

someProperty.addListener(listener);
someOtherProperty.addListener(listener);

通常您会按如下方式使用 bean 引用:

public class Person {
    // parameters are "owning bean" (i.e. this person), property name, and initial value:
    private final StringProperty name = new SimpleStringProperty(this, "name", "Fred");
    public StringProperty nameProperty() {
        return name ;
    }
    public final String getName() {
        return nameProperty().get();
    }
    public final void setName(String name) {
        nameProperty().set(name);
    }
    // ...
}