如果我遵循所描述的 JavaFX 属性定义,我想要做的事情就很好here。
现在,我想使用 Java Beans 属性适配器来定义 Java Beans 对象的属性。由于没有文档,我无法弄清楚它是如何工作的。
假设我有一个简单的 POJO 类:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
}
和一个 Person 属性:
public class PersonProperty {
private Person person = new Person();
private JavaBeanStringProperty name;
public PersonProperty() throws NoSuchMethodException {
name = JavaBeanStringPropertyBuilder.create().bean( person ).name( "name" ).build();
}
public Person getPerson() {
return person;
}
public void setPerson( Person person ) {
this.person = person;
}
public JavaBeanStringProperty nameProperty() {
return name;
}
}
最后是一个测试:
public void personTest() throws NoSuchMethodException {
PersonProperty pp = new PersonProperty();
pp.getPerson().setName( "A" );
pp.getPerson().setName( "B" );
pp.nameProperty().addListener( new ChangeListener<String>() {
@Override
public void changed( ObservableValue<? extends String> ov, String t, String t1 ) {
System.out.println( "from " + t + " to " + t1 );
}
} );
pp.getPerson().setName( "C" );
pp.getPerson().setName( "D" );
}
我期待看到:
from B to C
from C to D
相反,什么也没有出现。
如果我添加pp.nameProperty().set("E")
在 personTest 结束时我得到from B to E
我认为这里的问题是 Person 确实是一个 POJO,但不是一个 JavaBean:它缺少 PropertyChangeListeners 的钩子。 Java 不会神奇地知道 Person#name 何时发生变化。相反,JavaFX 适配器将寻找一种方法来添加 PropertyChangeListener 并侦听名为“name”的属性的事件。如果将 PropertyChangeSupport 实例添加到 Person 类,它将按预期工作:
public class Person {
private String name;
private PropertyChangeSupport _changeSupport;
public Person() {
_changeSupport = new PropertyChangeSupport(this);
}
public String getName() {
return name;
}
public void setName( String name ) {
final String prev = this.name;
this.name = name;
_changeSupport.firePropertyChange("name", prev, name);
}
public void addPropertyChangeListener(final PropertyChangeListener listener) {
_changeSupport.addPropertyChangeListener(listener);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)