JavaBeans属性适配器如何工作? [英] How does JavaBeans Property Adapter work?
问题描述
What I'm trying to do works fine if I follow the JavaFX property definition described here. Now, instead, I want to define properties from Java Beans objects using Java Beans Property Adapter. Since there is no documentation I can't figure out how it works.
假设我有一个简单的POJO类:
Suppose I have a simple POJO class:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
}
和一个PersonProperty:
and a PersonProperty:
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
相反,什么也没有出现.
Instead nothing appears.
如果我在personTest末尾添加pp.nameProperty().set("E")
,我会得到from B to E
If I add pp.nameProperty().set("E")
at the end of personTest I get from B to E
推荐答案
我认为这里的问题是Person确实是POJO,但不是JavaBean:它缺少PropertyChangeListeners的钩子. Java不会神奇地知道Person#name何时更改.相反,JavaFX适配器将寻找一种添加PropertyChangeListener并侦听名为"name"的属性的事件的方法.如果将PropertyChangeSupport实例添加到Person类,它将按预期工作:
I think the issue here is that Person is indeed a POJO, but not a JavaBean: It is missing the hooks for PropertyChangeListeners. Java will not magically know when Person#name changes. Instead, the JavaFX adapter will look for a way to add a PropertyChangeListener and listen to events for a property called 'name'. If you add a PropertyChangeSupport instance to your Person class it will work as expected:
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);
}
}
这篇关于JavaBeans属性适配器如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!