javafx双向变更通知不起作用?

时间:2013-07-02 14:07:49

标签: java javafx bind

考虑以下情况:

我将TextField的string-property绑定到float-property:

TextField txtField;
SimpleFloatProperty floatprop;

void bind(){
  txtField.textProperty().bindBidiretional(floatprop, NumberFormat.getInstance);
}

此外,我想检查值是否为正,我想在必要时重置该值:

floatprop.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {                
    SimpleFloatProperty prop = (SimpleFloatProperty)ov;
    if(t.floatValue() <= 0)
        prop.set(t1.floatValue());
    else
        prop.set(t.floatValue());
    }
});

这不起作用。无论我在文本字段中键入什么内容,都不会检查该值,即不会重置负值。

编辑:有点距离,我也明白为什么。在设置prop时,将触发已更改的事件以进行方便的无限递归。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

对我来说,它是在changed

的开头进行检查的
if (t != null && t.equals(t1))
    return;
奇怪的是,这种方式有时也会失败。然后,除了使用标志之外别无他法,如下所示:

MyListener implements ChangeListener<...>{
   boolean fired;
   public void changed(...){
      if(fired)
          return;
      fired = true;
      // Change the variable...
      fired = false; 
   }
}

我不喜欢后一种方式,但看起来没有其他选择。