我正在尝试使用一些绑定功能在JavaFX中创建自定义控件。这是我的问题:我有一个DoubleProperty
的类,我用它来计算自定义控件中元素的位置。这是代码:
public class CustomControl extends Region {
private DoubleProperty positionProperty;
public CustomControl() {
positionProperty= new DoublePropertyBase(0.0) {
@Override public Object getBean() { return CustomControl.this; }
@Override public String getName() { return "position"; }
@Override protected void invalidated() { updatePostion(); }
};
}
public DoubleProperty positionProperty() { return positionProperty; }
public double getPosition() { return positionProperty.get(); }
public void setPosition(double value) { positionProperty.set(value); }
private void updatePosition() {
double value = doubleProperty.get();
//compute the new position using value
}
}
在我的应用程序中,我有两个CustomControl
,我希望当我在第一个方法上调用方法setPosition()
时,第二个方法也会更新其组件的位置。为此,我将这两个positionProperty
中的CustomControl
绑定为:
CustomControl control1 = new CustomControl();
CustomControl control2 = new CustomControl();
control2.positionProperty.bind(control1.positionProperty);
然后当我打电话给例如
control1.setPosition(50.0);
只有control1
组件的位置才会更新,实际上当我调用方法setPosition()
时,invalidated()
positionProperty
的方法control1
实际上是被调用的,但不是我所认为的positionProperty
contol2
之一。如何实现我想要的目标?谢谢!
PS :我还注意到使用方法bindBidirectional()
而不是bind()
有效,但是它也不应该只使用bind()
吗?
编辑:示例代码可在此处获取:https://luca_bertolini@bitbucket.org/luca_bertolini/customcontrolexample.git
答案 0 :(得分:2)
JavaFX对所有绑定使用延迟评估,这意味着当out.positionProperty
对象发生更改时,不会立即考虑新值。当且仅当随后请求该值时,才会发生这种情况。
试试这个:
out.positionProperty().addListener(new InvalidationListener() {
@Override
public void invalidated(final Observable observable) {
// System.out.println("It must go now.");
}
});
您将看到这次您的代码可以正常工作。