无论何时更改,目标字符串属性都由布尔属性或另一个字符串属性确定。当布尔属性改变时,将计算一个字符串值并将其分配给目标属性;当其他字符串属性获取新值时,目标属性也会获取该值。以下是我到目前为止的代码。
import javafx.beans.binding.Bindings;
import javafx.beans.binding.StringBinding;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class BindingTest {
public static void main(String[] args) {
StringProperty stringProperty = new SimpleStringProperty();
BooleanProperty booleanProperty = new SimpleBooleanProperty();
StringProperty targetProperty = new SimpleStringProperty();
StringBinding sb = new StringBinding() {
{super.bind(booleanProperty);}
@Override
protected String computeValue() {
if(booleanProperty.get()) {
return "boolean is true";
} else {
return "boolean is false";
}
}
};
// Bind targetProperty to either stringProperty or customBinding
targetProperty.bind(Bindings.when(booleanProperty)
.then(sb)
.otherwise(stringProperty));
// Test the bindings
stringProperty.set("Hello");
System.out.println(targetProperty.get());
booleanProperty.set(true);
System.out.println(targetProperty.get());
stringProperty.set("Hello again");
System.out.println(targetProperty.get());
}
}
预期结果是:
Hello
boolean is true
Hello again
但它打印了
Hello
boolean is true
boolean is true
如果您检查绑定逻辑,则您正在检查布尔属性,并且仅在布尔值为 false 时才打印自定义字符串。
targetProperty.bind(Bindings.when(booleanProperty)
.then(sb)
.otherwise(stringProperty));
因此,只要 booleanProperty 为 true,它就不会关心 stringProperty 值。你把它变成了真,但再也没有变回假。所以你不能期望新的字符串值。
因此,要使其按照预期输出工作,您还需要将 booleanProperty 设置为 false。
booleanProperty.set(false); // You are missing this line
stringProperty.set("Hello again");
System.out.println(targetProperty.get());