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()
时,第二个也会更新其组件的位置。为此,我像这样绑定了两个 CustomControl
的 positionProperty
:
CustomControl control1 = new CustomControl();
CustomControl control2 = new CustomControl();
control2.positionProperty.bind(control1.positionProperty);
然后当我打电话时
control1.setPosition(50.0);
只有control1
的组件位置被更新,确实当我调用setPosition()
方法时,control1
的positionProperty
方法invalidated()
=] 实际上被调用了,但不是我所期望的 contol2
的 positionProperty
之一。我应该如何实现我想要的?谢谢!
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.");
}
});
你会发现这次你的代码可以正常工作。
我正在尝试使用一些绑定功能在 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()
时,第二个也会更新其组件的位置。为此,我像这样绑定了两个 CustomControl
的 positionProperty
:
CustomControl control1 = new CustomControl();
CustomControl control2 = new CustomControl();
control2.positionProperty.bind(control1.positionProperty);
然后当我打电话时
control1.setPosition(50.0);
只有control1
的组件位置被更新,确实当我调用setPosition()
方法时,control1
的positionProperty
方法invalidated()
=] 实际上被调用了,但不是我所期望的 contol2
的 positionProperty
之一。我应该如何实现我想要的?谢谢!
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.");
}
});
你会发现这次你的代码可以正常工作。