Simple*Property
类是对应的Property
抽象类的完整独立实现,不依赖于任何其他对象。因此,例如,SimpleStringProperty
本身包含一个(私有的)String
字段,它保存属性的当前值。
您展示的构造函数的参数:
new SimpleStringProperty(bean, "name")
bean
: 属性所属的bean(如果有)
name
: 属性的名称
在ChangeListener
的changed(...)
方法中,bean
可以用于检索已更改属性的“所属bean”,因此很有用。 name
也可以类似地使用(如果您已将相同的监听器注册到多个属性,则可以确定哪个属性已更改:但我从未使用过此模式)。
因此,将SimpleStringProperty
用作对象的可观察属性的典型用法如下:
public class Person {
private final StringProperty firstName
= new SimpleStringProperty(this, "firstName");
public final String getFirstName() {
return firstName.get();
}
public final void setFirstName(String firstName) {
this.firstName.set(firstName);
}
public StringProperty firstNameProperty() {
return firstName ;
}
}
您要查找的功能:将现有的Java Bean样式属性包装在JavaFX可观察属性中,这一功能由javafx.beans.property.adapter
包中的类实现。因此,例如,您可以执行以下操作:
StringProperty nameProperty = new JavaBeanStringPropertyBuilder()
.bean(bean)
.name("name")
.build();
呼叫
nameProperty.set("James");
使用这个设置将有效地导致调用
bean.setName("James");
如果 bean 支持 PropertyChangeListener,则 JavaBeanStringProperty 将向 bean 注册一个 PropertyChangeListener。对于 Java Bean 的 name 属性的任何更改都将被 JavaBeanStringProperty 转换为 JavaFX 属性更改。因此,如果基础的 JavaBean 支持 PropertyChangeListener,则通过 PropertyChangeListener 更改 bean。
bean.setName(...);
将会导致任何已注册到 JavaBeanStringProperty 的 ChangeListener(或 InvalidationListener)被通知更改。
例如,如果 Bean 类是
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class Bean {
private String name ;
private final PropertyChangeSupport propertySupport ;
public Bean(String name) {
this.name = name ;
this.propertySupport = new PropertyChangeSupport(this);
}
public Bean() {
this("");
}
public String getName() {
return name ;
}
public String setName(String name) {
String oldName = this.name ;
this.name = name ;
propertySupport.firePropertyChange("name", oldName, name);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
}
}
那么以下的代码:
Bean bean = new Bean();
StringProperty nameProperty() = new JavaBeanStringPropertyBuilder()
.bean(bean)
.name("name")
.build();
nameProperty().addListener((obs, oldName, newName) -> System.out.println("name changed from "+oldName+" to "+newName));
bean.setName("James");
System.out.println(nameProperty().get());
将生成以下输出:
name changed from to James
James
如果JavaBean不支持PropertyChangeListener,则通过bean.setName(...)对bean的更改将不会传播到注册在JavaBeanStringProperty上的ChangeListener或InvalidationListener。
因此,如果bean只是...
public class Bean {
public Bean() {
this("");
}
public Bean(String name) {
this.name = name ;
}
private String name ;
public String getName() {
return name ;
}
public void setName(String name) {
this.name = name ;
}
}
JavaBeanStringProperty无法观察到更改,因此更改侦听器将永远不会被调用
bean.setName()
。因此,上面的测试代码将仅输出:
James