在Javafx中,如何将字符串属性绑定到布尔属性和另一个字符串属性

问题描述 投票:0回答:1

无论何时更改,目标字符串属性都由布尔属性或另一个字符串属性确定。当布尔属性改变时,将计算一个字符串值并将其分配给目标属性;当其他字符串属性获取新值时,目标属性也会获取该值。以下是我到目前为止的代码。

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
java javafx binding
1个回答
0
投票

如果您检查绑定逻辑,则您正在检查布尔属性,并且仅在布尔值为 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());
© www.soinside.com 2019 - 2024. All rights reserved.