我是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;
}
}
}
生成的输出是
之前的适配器:0.0模型之前:0.0之前的Bean:0.0
适配器之后:123.0模型之后:0.0 Bean之后:123.0
因此,通过将“普通”Java对象设置为新值,JavaBeanDoubleProperty将被告知有关更改,但JavaFX属性不是,尽管它已绑定到适配器。为什么呢?
即使按照here,
所述向Pojo添加PropertyChangeSupportpublic static class Pojo
{
private double value;
private PropertyChangeSupport pcs;
public Pojo()
{
pcs = new PropertyChangeSupport(this);
}
public double getValue()
{
return value;
}
public void setValue(double value)
{
final double oldValue = this.value;
this.value = value;
pcs.firePropertyChange("name", oldValue, value);
}
public void addPropertyChangeListener(
final PropertyChangeListener listener)
{
pcs.addPropertyChangeListener(listener);
}
},
它不起作用。 (不幸的是,使用BeanPathAdapter的第二次试用也没有用。)
答案 0 :(得分:2)
你刚才Pojo.setValue(double value)
。此方法为属性" name"触发PropertyChangeEvent。它应该是"价值"。
只需将其更改为
public void setValue(double value)
{
final double oldValue = this.value;
this.value = value;
pcs.firePropertyChange("value", oldValue, value);
}
它会起作用。
答案 1 :(得分:1)
绑定应该在适配器和模型之间。不要直接修改pojo值,适配器将进行更新。替换线:
pojo.setValue(123d);
有了这个,
adapter.setValue(123d);
导致预期输出,所有值都更新,包括pojo。设置模型的值时也会发生相同的情况。此post的图表可以帮助您查看工作情况。