如何创建一个布尔属性/绑定,其值基于整数?

时间:2017-06-08 08:21:03

标签: java javafx

我想创建一个通过int保存布尔信息的类:如果其值大于0,则布尔值为true,否则为false。< / p>

这是一个封装此行为的类:

public class CumulativeBoolean {

    private int cumulative = 0;

    public boolean get() {
        return cumulative > 0;
    }

    public void set(boolean val) {
        cumulative += val ? 1 : -1;
    }
}

我想从这个设计中创建一个允许绑定和监听的JavaFX类。我考虑延长BooleanBindingBooleanPropertyBase,他们都持有private boolean value作为值,而我想要的是int

这就是我对BooleanBinding所拥有的:

public class CumulativeBooleanBinding extends BooleanBinding {

    private int cumulative = 0;

    public void set(boolean val) {
        cumulative += val ? 1 : -1;
        invalidate();
    }

    @Override
    protected boolean computeValue() {
        return cumulative != 0;
    }
}

但是,我并不认为BooleanBinding的想法是支持set功能,而且还存在在绑定值时设置值的问题。

另一方面,

BooleanPropertyBase不允许我在更新时失效,因为其markInvalid方法和valid字段是私有的。

我怎么能实现这个目标?

3 个答案:

答案 0 :(得分:1)

如果要使用JavaFX的绑定功能,则必须使用ObservableValue(例如SimpleIntegerProperty)。

以下代码显示了如何实现它的快速示例:

SimpleIntegerProperty intProp = new SimpleIntegerProperty(0);
BooleanBinding binding = intProp.greaterThanOrEqualTo(0);

如果您不想在类中使用Integer的ObservableValue,另一个选项是在设置int时更新BooleanProperty:

SimpleBooleanProperty fakeBinding = new SimpleBooleanProperty(value >= 0);

并且在每次调用set方法之后:

fakeBinding.set(value >= 0);
编辑:似乎MBec比我快:p

答案 1 :(得分:0)

创建IntegerProperty然后从该属性创建BooleanBinding会不会更容易?像这样:

IntegerProperty cumulative = new SimpleIntegerProperty();
BooleanBinding greaterThanZeroCumulative = cumulative.greaterThan(0);

答案 2 :(得分:0)

根据评论中的讨论,我最终得到了基于BooleanBinding的设计。为了消除与set期望相关的混淆,我将其重命名为add