【发布时间】:2016-09-19 18:35:00
【问题描述】:
我最近试图将我的双重属性的范围限制为(0.0 - 1.0)。超出此范围的更改不应产生任何影响,或引发错误。
目前我有两种方法:
-
只读,只允许在访问器上更改:
private ReadOnlyDoubleWrapper numProperty = new ReadOnlyDoubleWrapper(0); public final double getNum() { return numProperty().get(); } public final void setNum(double num) { if(num < 0) num = 0; if(num > 1) num = 1; numProperty.set(num); } public ReadOnlyDoubleProperty numProperty() { return numProperty.getReadOnlyProperty(); } -
设置监听器重置值:
private DoubleProperty numProperty = new SimpleDoubleProperty(0); numProperty.addListener(new BoundRangeListener(numProperty, 0.0, 1.0)); class BoundRangeListener implements ChangeListener<Number> { Property<Number> prop; double min, max; BoundRangeListener(Property<? extends Number> prop, double min, double max) { this.prop = prop; this.min = min; this.max = max; } public void changed(ObservableValue<? extends Number> o, Number oldValue, Number newValue) { if(newValue.doubleValue() < min) prop.set(min); if(newValue.doubleValue() > max) prop.set(max); // Optional: throw exception } }
不过,我对这两种解决方案都不满意。第一个不允许我的用户绑定属性;不是我想要的,没有充分的理由。第二个将向其他侦听器触发 2 个事件;不好。
所以我的问题是:是否有任何开箱即用的方法来拒绝更改,或将 number 属性绑定到一个范围?
【问题讨论】:
-
我将使用
ReadOnlyDoubleWrapper代替DoubleProperty重构第一个解决方案,numProperty()方法返回numProperty.getReadOnlyProperty()。您还可以考虑继承SimpleDoubleProperty并覆盖set(...)和setValue(...)方法。 (虽然有点难以真正回答这个问题,除非你说出为什么你对现有的解决方案不满意。) -
压倒一切...没想到这个... +1。将其发布为答案。
-
已编辑,为什么我不舒服。
标签: java javafx properties