3

如果我遵循此处描述的 JavaFX 属性定义,我正在尝试做的事情很好。现在,我想使用 Java Beans 属性适配器从 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<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

4

1 回答 1

3

我认为这里的问题是 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);
    }
}
于 2012-11-04T13:08:21.513 回答