将 javafx 属性的值保持在特定范围内的最佳方法是什么?
(或者 - 这是一种不好的做法,是否存在从不过滤由 javafx 属性包装的值的任何理由?)
示例 1:避免 IntegerProperty 中的负值示例 2:将 IntegerProperty
的值保持在 List 的范围内
第一个想法:-覆盖IntegerPropertyBase.set(int)
。它是安全的?实际上setValue(int)
只调用set(int)
,但是 - 如果有一天这个实现发生变化 - 对值集的控制就会丢失。
第二个想法:-覆盖IntegerPropertyBase.invalidate()
。但是此时已经设置了值。
它是否更适合 javafx 属性抛出一个IllegalArgumentException
(或一个ArrayIndexOutOfBoundsException
,如果包装的值是数组的索引),或者更好地拒绝超出范围的值,设置回边界中的最后一个值?
也许是这样的:
class BoundedIntegerProperty extends IntegerPropertyBase {
(...)
int oldValue = defaultValueInBounds;
boolean settingOldValue = false;
public void invalidated() {
if(!settingOldValue){
if(outOfBounds(get())){
settingOldValue = true;
set(oldValue);
} else {
oldValue = get();
}
} else
settingOldValue = false;
}
}
仅在 invalidated() 中为超出范围的值抛出异常可能会使属性的值超出范围。
我是否忽略了为过滤值而提供的 javafx 属性中的任何内容?
(如有必要,请帮助我改进本文可能不好的英文......)