2017-07-02 4 views
-1

以下のサンプルコードによると、Java FX Bindingsはデフォルトでは貪欲でないようです。Javafx greedy binding

assertEquals(2,calledEffect); 

は が、

assertEquals(2,keepBinding.get()) 

ないが動作しません。

バインディングが自動的にアクティブになって、欲張りな動作をしていることを確認するにはどうすればよいですか?

long calledEffect=0; 
private LongBinding keepBinding; 
public long callMe(long value) { 
    calledEffect=value+1; 
    return calledEffect; 
} 

@Test 
public void testBinding() { 
    SimpleLongProperty lp = new SimpleLongProperty(); 
    lp.setValue(4711); 
    keepBinding=Bindings.createLongBinding(()->callMe(lp.get()),lp); 
    lp.setValue(1); 
    //assertEquals(2,calledEffect); 
    assertEquals(2,keepBinding.get()); 
} 

答えて

1

バインディングは、値を取得する必要がある場合にのみ計算されます。あなたは、値が変わるコードを呼び出したい場合は、変更リスナーを使用します。

lp.addListener((obs, oldValue, newValue) -> callMe(newValue)); 

あなたのコードは、その後に変更する必要があります

long calledEffect=0; 
private LongBinding keepBinding; 
public long callMe(Number newValue) { 
    calledEffect=newValue.longValue()+1; 
    return calledEffect; 
} 

@Test 
public void testBinding() { 
    SimpleLongProperty lp = new SimpleLongProperty(); 
    lp.setValue(4711); 
    keepBinding=Bindings.createLongBinding(()->callMe(lp.get()),lp); 
    lp.addListener((obs, oldValue, newValue) -> callMe(newValue)); 
    lp.setValue(1); 
    assertEquals(2,calledEffect); 
    assertEquals(2,keepBinding.get()); 
}