我想创建一个通过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类。我考虑延长BooleanBinding
或BooleanPropertyBase
,他们都持有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
字段是私有的。
我怎么能实现这个目标?
答案 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
。