为什么JavaBean适配器不更新JavaFX属性?

为什么JavaBean适配器不更新JavaFX属性?,javafx,Javafx,我是JavaFX新手,需要在GUI(使用JavaFX属性)和我的旧Java代码(不使用JavaFX属性)之间进行双向绑定。我尝试使用JavaBean适配器,如下简单示例所示: import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import javafx.beans.property.DoubleProperty; import javafx.beans.property.Simp

我是JavaFX新手,需要在GUI(使用JavaFX属性)和我的旧Java代码(不使用JavaFX属性)之间进行双向绑定。我尝试使用JavaBean适配器,如下简单示例所示:

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.adapter.JavaBeanDoubleProperty;
import javafx.beans.property.adapter.JavaBeanDoublePropertyBuilder;

public class App
{
    public static void main(String[] args) throws NoSuchMethodException
    {
        Pojo pojo = new Pojo();
        FXModel model = new FXModel();

        JavaBeanDoubleProperty adapter = JavaBeanDoublePropertyBuilder
                .create().bean(pojo).name("value").build();

        model.valueProperty().bindBidirectional(adapter);

        System.out.println("Adapter before: " + adapter.get());
        System.out.println("Model before: " + model.getValue());
        System.out.println("Bean before: " + pojo.getValue());

        pojo.setValue(123d);

        System.out.println();
        System.out.println("Adapter after: " + adapter.get());
        System.out.println("Model after: " + model.getValue());
        System.out.println("Bean after: " + pojo.getValue());
    }

    public static class Pojo
    {
        private double value;

        public double getValue()
        {
            return value;
        }

        public void setValue(double value)
        {
            this.value = value;
        }
    }

    public static class FXModel
    {
        private final DoubleProperty value = new SimpleDoubleProperty();

        public double getValue()
        {
            return value.get();
        }

        public void setValue(double value)
        {
            this.value.set(value);
        }

        public DoubleProperty valueProperty()
        {
            return value;
        }
    }
}
生成的输出是

Adapter before:0.0 Model before:0.0 Bean before:0.0

适配器after:123.0模型after:0.0 Bean after:123.0

因此,通过将“普通”Java对象设置为一个新值,JavaBeanDoubleProperty会被告知更改,但JavaFX属性不会,尽管它已绑定到适配器。为什么?

即使通过如上所述向Pojo添加PropertyChangeSupport


它不起作用。(不幸的是,使用的第二次试验也不起作用。)

绑定应该在适配器和模型之间。不要直接修改pojo值,适配器将进行更新。更换线路:

pojo.setValue(123d);
有了这个,

adapter.setValue(123d);

生成预期输出,更新所有值,包括pojo。设置模型的值时也会发生同样的情况。此处的图表可以帮助您可视化工作。

您刚刚在
Pojo.setValue(双值)
中滑了一下。此方法为属性“name”激发PropertyChangeEvent。它应该是“价值”。 把它改成

public void setValue(double value)
{
    final double oldValue = this.value;
    this.value = value;
    pcs.firePropertyChange("value", oldValue, value);
}
它会有用的。

有用,谢谢。(我还不能投赞成票,因为我没有足够的声誉,但我下次再投。)
public void setValue(double value)
{
    final double oldValue = this.value;
    this.value = value;
    pcs.firePropertyChange("value", oldValue, value);
}