【问题标题】:JavaFX: Storing null in a SimpleIntegerPropertyJavaFX:在 SimpleIntegerProperty 中存储 null
【发布时间】:2017-02-10 13:40:14
【问题描述】:

我有一个SimpleIntegerProperty,它应该能够存储null。但是,这是不可能的,正如IntegerProperty的JavaDoc中所写:

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

这也适用于其他属性,例如LongPropertyFloatPropertyDoublePropertyBooleanProperty(但不适用于StringProperty,它允许null!)。为什么会这样?是否有解决方法可以将null 存储在这些属性中?

【问题讨论】:

  • 原始包装器类型IntegerPropertyDoubleProperty 等的目的正是为了:原始类型的可观察包装器。所以IntegerProperty 打算包装一个int,它当然不能采用null 值。为了方便,IntegerProperty实现了Property<Number>,所以继承了setValue(Number)方法;但是,它不打算用于将值设置为null(并且正如您所观察到的,已记录将值设置为默认值0)。如果你想要一个可以接受 null 的 observable,请使用 ObjectProperty<Integer>

标签: java javafx null primitive


【解决方案1】:

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

注意:这个方法应该接受null而不抛出异常,改为设置“0”。

如果您查看IntegerPropertyBase 类的代码,您还可以看到该值实际上存储为原始int (which never can be null)。这也是SimpleIntegerProperty的JavaFX API中指定的:

此类提供包装 int 值的属性的完整实现。

解决方案: 您可以通过使用SimpleObjectProperty<Integer> 而不是SimpleIntegerProperty 来简单地规避这种情况,因为SimpleObjectProperty 允许null

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2017-05-22
    相关资源
    最近更新 更多