JavaFX Property的invalidate()方法未使用绑定调用

时间:2017-02-06 21:50:24

标签: javafx properties binding custom-controls invalidation

我正在尝试使用一些绑定功能在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

1 个答案:

答案 0 :(得分:2)

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

试试这个:

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

您将看到这次您的代码可以正常工作。