【问题标题】:Spinner<Integer> bind to IntegerPropertySpinner<Integer> 绑定到 IntegerProperty
【发布时间】:2016-03-07 03:55:22
【问题描述】:

我想使用 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&lt;Integer&gt;,我找不到在IntegerPropertyProperty&lt;Integer&gt; 之间转换的方法。

显然下面会产生编译错误:

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

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

【问题讨论】:

    标签: java javafx-8


    【解决方案1】:

    你可以包装一个 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 创建一个双向连接到它所包装的属性的属性。

    【讨论】:

    • 谢谢。我决定另辟蹊径,包装 Spinner 属性并从 IntegerProperty 调用 bindBiDirectional 以绑定 2 个 IntegerProperty 对象(因此我不需要触摸我正在使用的模型对象)。
    • @SeeMoreGain,请分享代码sn-p,为您解决问题的方法?
    • 像@Buddha 我也对一些代码感兴趣。但是,现在我使用的是:spinner.getValueFactory().valueProperty().bindBidirectional(integerProperty.asObject());。由于“过早的垃圾收集”问题,仍然不得不重新设计此代码,这使绑定无法正常工作。 Following solution 已修复: 1. 声明一个实例变量:private ObjectProperty&lt;Integer&gt; spinnerValue;。 2. 初始化:spinnerValue = integerProperty.asObject();。 3.使用它:spinner.getValueFactory().valueProperty().bindBidirectional(spinnerValue);.
    • 这对我不起作用。它会编译,但会在 spinner.getValueFactory...bindBidirectional 行抛出 nullPointerException 错误。但是,当我反转绑定并这样做时: objectProp.bindBidirectional(spinner.getValueFactory().valueProperty()); 效果很好。
    • @Buddha 和其他人,我们现在在答案本身中有一个答案,在 cmets 中有另外三个答案。我的猜测是其中一个是优越/通用的,我应该只花时间去理解(和使用)那个。你们中的任何人都可以自信地说我应该选择哪一个吗?我会给它一两天的时间,如果我没有收到回复,我会提出一个新问题。
    【解决方案2】:

    好吧,已经晚了,但让我为其他人提出其他建议。您可以简单地在您的“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());
    

    【讨论】:

      猜你喜欢
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 2023-02-07
      相关资源
      最近更新 更多