3

ここで説明するJavaFXプロパティの定義に従えば、私がやろうとしていることはうまくいきます。代わりに、JavaBeansプロパティアダプタを使用してJavaBeansオブジェクトからプロパティを定義したいと思います。ドキュメントがないので、それがどのように機能するのか理解できません。

単純な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 に答える