JavaBeans Property Adapter如何工作?

如果我遵循这里描述的JavaFX属性定义,我正在尝试做的工作正常。 现在,我想使用Java Beans Property Adapter从Java Beans对象定义属性。 由于没有文档,我无法弄清楚它是如何工作的。

假设我有一个简单的POJO类:

public class Person { private String name; public String getName() { return name; } public void setName( String name ) { this.name = name; } } 

和一个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() { @Override public void changed( ObservableValue 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")添加pp.nameProperty().set("E") ,我会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); } }