JavaFX 属性 的 invalidate() 方法未通过绑定调用

JavaFX Property's invalidate() method not called with binding

我正在尝试使用一些绑定功能在 JavaFX 中制作自定义控件。这是我的问题:我有一个 class 和一个 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() 时,第二个也会更新其组件的位置。为此,我像这样绑定了两个 CustomControlpositionProperty

CustomControl control1 = new CustomControl();
CustomControl control2 = new CustomControl();
control2.positionProperty.bind(control1.positionProperty);

然后当我打电话时

control1.setPosition(50.0);

只有control1的组件位置被更新,确实当我调用setPosition()方法时,control1positionProperty方法invalidated() =] 实际上被调用了,但不是我所期望的 contol2positionProperty 之一。我应该如何实现我想要的?谢谢!

PS:我还注意到使用方法 bindBidirectional() 而不是 bind() 有效,但它不应该仅使用bind() 也是吗?

编辑:此处提供示例代码:https://luca_bertolini@bitbucket.org/luca_bertolini/customcontrolexample.git

JavaFX 对所有绑定使用惰性评估,这意味着当您的 out.positionProperty 对象发生更改时,不会立即考虑新值。当且仅当随后请求该值时,才会发生这种情况。

试试这个:

out.positionProperty().addListener(new InvalidationListener() {
    @Override
    public void invalidated(final Observable observable) {
       // System.out.println("It must go now.");
    }
});

你会发现这次你的代码可以正常工作。