2013-07-02 21 views
1

考慮以下情況:javafx雙向更改通知不起作用?

我一個TextField的字符串屬性綁定到一個浮動屬性:

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時,更改的事件將觸發一個方便的無限遞歸。我該如何解決這個問題?

+0

你能提供一個SSCCE嗎? – Puce

+0

嗯,我發現,它爲什麼不起作用。我現在想知道如何使它工作:D。詳情請參閱我的編輯。 –

回答

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; 
    } 
} 

我不喜歡後者的方式,但它看起來像沒有別的選擇。