有人能指导我在JavaFX(Java8)中何时在addListener上使用bind方法吗?我发现两者非常相似

有人能指导我在JavaFX(Java8)中何时在addListener上使用bind方法吗?我发现两者非常相似,javafx,java-8,Javafx,Java 8,基本上,我看到bind方法被用来相对于窗格维度的变化来调整节点维度。 此外,我有时看到Java中的addListener方法也以类似的方式使用。 因此,我无法理解在JavaFX的情况下,什么时候应该选择一个而不是另一个?您可以向添加更改侦听器,以便在值更改时执行任意操作: IntegerProperty value = new SimpleIntegerProperty(42); value.addListener((obs, oldValue, newValue) -> Sys

基本上,我看到bind方法被用来相对于窗格维度的变化来调整节点维度。 此外,我有时看到Java中的addListener方法也以类似的方式使用。
因此,我无法理解在JavaFX的情况下,什么时候应该选择一个而不是另一个?

您可以向添加更改侦听器,以便在值更改时执行任意操作:

IntegerProperty value = new SimpleIntegerProperty(42);
value.addListener((obs, oldValue, newValue) -> 
    System.out.println("Value changed from "+oldValue+" to "+newValue));
一个常见的要求是当一个属性的值发生变化时自动改变另一个属性的值。对于这个常见但特定的需求,您可以使用绑定。有时绑定比侦听器更易于编码:

IntegerProperty valueTimesTwo = new SimpleIntegerProperty();
valueTimesTwo.bind(value.multiply(2));
在其他情况下,这实际上只是一个选择,你会更清楚地发现:

DoubleProperty logValuePlusOne = new SimpleDoubleProperty();

logValuePlusOne.bind(Bindings.createDoubleBinding(
    () -> Math.log(value.get()+1),
    value);

// or:
value.addListener((obs, oldValue, newValue) -> 
    logValue.set(Math.log(newValue.intValue()+1)));
上述绑定版本的一个优点是,删除绑定更容易一些:

logValuePlusOne.unbind();

虽然您可以对实现
javafx.beans.Observable
(有很多)的任何类调用
addListener()
,但
bind()
方法是在
javafx.beans.property.property
类中定义的,该类在层次结构中的位置更深,它本身扩展了
可观察的
接口

因此,
bind()
只能在实现
属性的类上调用。对于
javafx.beans.property.property
的子类,可以使用
bind()
addListener()

addListener()
相比,
bind()
的两个主要优点是:

  • javafx
    包中的所有
    bind()
    调用都是,而
    addListener()
    使用强引用。如果你不小心,没有正确地删除所有的侦听器;后者容易导致内存泄漏,而前者则不会
  • 如果您的类已经实现了
    属性
    接口,那么您可以创建双向绑定,这在可观察对象中是不可能的

<> >,我强烈建议使用<代码> bDUDE()/>代码> <代码> AddiistEnter()/<代码> /P>,特别是当您还考虑双向绑定时,清楚绑定的优点是什么。