2017-02-10 109 views
4

我有一个SimpleIntegerProperty,它应该能够存储null。但是,这是不可能的,因为写在IntegerProperty的JavaDoc:JavaFX:在SimpleIntegerProperty中存储null

注:设置或绑定这个属性到null值属性设置为“0.0”。见setValue(java.lang.Number)

这也适用于其他属性,如LongPropertyFloatPropertyDoublePropertyBooleanProperty(但不StringProperty,这使得null!)。为什么会这样?有没有一种解决方法可以在这些属性中存储null

+0

的原始包装类型,'IntegerProperty','DoubleProperty'等,都是意思就是:原始类型的可观察包装器。所以'IntegerProperty'旨在包装一个'int',这当然不能具有'null'值。为了方便,'IntegerProperty'实现'Property ',所以它继承'setValue(Number)'方法;然而它并不打算用于将该值设置为“null”(并且正如您观察到的,记录将该值设置为默认值“0”)。如果你想要一个可以接受'null'的observable,使用'ObjectProperty '。 –

回答

4

IntegerProperty.setValue(java.lang.Number)方法在接口WriteableIntegerValueWriteableValue中指定。的WriteableIntegerValue的JavaDoc规定:

注:此方法应该接受null没有抛出异常,设置 “0” 代替。

如果您正在寻找在IntegerPropertyBase类的代码,你也可以看到,值实际存储为一个原始intwhich never can be null)。这也就是SimpleIntegerProperty JavaFX的API中规定:

这个类提供了一个全面实施物业包装一int价值。

: 可以简单地绕过,通过使用SimpleObjectProperty<Integer>代替SimpleIntegerProperty,作为SimpleObjectProperty允许null