将Spinner<Integer>绑定到IntegerProperty

9

我想使用FX8 Spinner 控件,但我想将源绑定到一个IntegerProperty

int MIN = 0;
int MAX = 5000;
int STEP = 500;
IntegerProperty integerProperty = new SimpleIntegerProperty();

Spinner<Integer> spinner = new Spinner<>(MIN, MAX, STEP);

我知道绑定是通过绑定到值工厂中的valueProperty来设置的。然而,这需要Property<Integer>,我找不到在IntegerPropertyProperty<Integer>之间进行转换的方法。

很明显,下面的代码会生成编译错误:

spinner.getValueFactory().valueProperty().bindBidirectional(integerProperty);

我需要为两个方向手动分配更改侦听器吗?肯定有更简洁的解决方案,可以使用 valueProperty,这不可能是未预料到的情况。

2个回答

9
您可以包装一个ObjectProperty:
ObjectProperty<Integer> objectProp = new SimpleObjectProperty<>(MIN);
IntegerProperty integerProperty = IntegerProperty.integerProperty(objectProp);

Spinner<Integer> spinner = new Spinner<>(MIN, MAX, STEP);

spinner.getValueFactory().valueProperty().bindBidirectional(objectProp);

IntegerProperty.integerProperty 创建一个与其封装的属性双向连接的属性。


1
谢谢。我决定采用另一种方式,包装Spinner属性并从IntegerProperty中调用bindBiDirectional以绑定2个IntegerProperty对象(这样我就不需要触及我正在使用的模型对象)。 - SeeMoreGain
2
@SeeMoreGain,请分享你解决问题的代码片段? - Buddha
像@Buddha一样,我也对一些代码感兴趣。然而,现在我正在使用:spinner.getValueFactory().valueProperty().bindBidirectional(integerProperty.asObject());。仍然需要重新设计这段代码,因为存在“过早垃圾回收”问题,导致绑定无法正常工作。以下解决方案解决了这个问题:1.声明一个实例变量:private ObjectProperty<Integer> spinnerValue;。2.初始化它:spinnerValue = integerProperty.asObject();。3.使用它:spinner.getValueFactory().valueProperty().bindBidirectional(spinnerValue); - SourceSeeker
这对我没有用。它可以编译,但在 spinner.getValueFactory...bindBidirectional 行会抛出 nullPointerException 错误。然而,当我反转绑定并像这样执行时:objectProp.bindBidirectional(spinner.getValueFactory().valueProperty()); 它完美地工作了。 - Michael Sims
@ Buddha 和其他人,我们现在在答案本身中有一个答案,评论中还有三个答案。我猜其中一个是优秀/通用的,我应该只花时间理解(和使用)那个答案。你们能否自信地说出我应该选择哪一个?如果我没有听到回复,我会等一两天,然后将其作为新问题提出。 - pateksan

0

好的,现在已经很晚了,但是我还是想为大家提供另一种解决方案。你可以直接在 'integerProperty' 上调用 asObject() 方法,这将返回一个 ObjectProperty 值。

int MIN = 0;
int MAX = 5000;
int STEP = 500;
IntegerProperty integerProperty = new SimpleIntegerProperty();

Spinner<Integer> spinner = new Spinner<>(MIN, MAX, STEP);

spinner.getValueFactory().valueProperty().bindBidirectional(integerProperty.asObject());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接