javafx - 有人可以指导我何时在 JavaFX(Java 8) 中使用 addListener 上的绑定(bind)方法吗?我发现两者非常相似

标签 javafx java-8

基本上,我看到绑定(bind)方法用于相对于 Pane 尺寸的变化来调整节点尺寸。 另外,我有时看到 Java 中的 addListener 方法以类似的方式使用。 所以我不明白在 JavaFX 的情况下什么时候应该选择其中一种?

最佳答案

您可以将更改监听器添加到 ObservableValue为了在值发生变化时执行任意操作:

IntegerProperty value = new SimpleIntegerProperty(42);
value.addListener((obs, oldValue, newValue) -> 
    System.out.println("Value changed from "+oldValue+" to "+newValue));

一个常见的要求是当另一个属性发生更改时自动更改一个属性的值。对于这种常见但特定的要求,您可以使用绑定(bind)。有时绑定(bind)比监听器更容易编写代码:

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)));

上述绑定(bind)版本的一个优点是删除绑定(bind)更容易一些:

logValuePlusOne.unbind();

关于javafx - 有人可以指导我何时在 JavaFX(Java 8) 中使用 addListener 上的绑定(bind)方法吗?我发现两者非常相似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36379055/

相关文章:

java - 从全文中检索字符串的一部分

Javafx,逐行滚动而不是逐页滚动的滚动 Pane

Java 8 java.util.Map#computeIfAbsent 与 java.util.Optional

java - 更新android studio 3.0.0时找不到错误:java. lang.ClassNotFoundException : Class org. openjdk.jdi.ReferenceType

java - 从java中的二维数组流式传输

java - 为什么 lambda 在抛出运行时异常时会更改重载?

testing - 如何使用 TestFX 在包含下划线的文本字段中写入字符串?

java - Java中重写接口(interface)方法

java - 防止 JavaFX 线程死于 JFXPanel Swing 互操作?

java.lang.IllegalStateException : Location is not set