2015-06-04 90 views
0

我試圖讓一個指向節點的屬性行:綁定屬性OBJECTPROPERTY的財產

ObjectProperty<Node> pointedToNode = new SimpleObjectProperty(); 

我想要一條線指向它,像這樣:

line.endXProperty().bind(pointedToNode.get().layoutXProperty()); 

的問題是當pointedToNode更改時,綁定值(pointedToNode.get())已更改,並且layoutXProperty()不再有效。

如果pointedToNode的值爲空,我還需要該行不可見。

我嘗試了一些自定義雙綁定沒有成功。

回答

2

使用簡單的API:

ChangeListener<Number> xListener = (obs, oldX, newX) -> 
    line.setEndX(newX.doubleValue()); 
pointedToNode.addListener((obs, oldNode, newNode) -> { 
    if (oldNode != null) { 
     oldNode.layoutXProperty().removeListener(xListener); 
    } 
    if (newNode != null) { 
     newNode.layoutXProperty().addListener(listener); 
    } 
}); 

或者使用EasyBind框架:

line.endXProperty().bind(
    EasyBind.select(pointedToNode) 
    .selectObject(Node::layoutXProperty) 
    .orElse(-1)); // value if pointedToNode is null 

您可以嘗試使用Bindings.select(標準)API,它看起來有點像EasyBind但有幾個缺點:它不能優雅地處理「鏈」中的null值(即如果pointedToNode.get()null);它不是類型安全的;並且容易過早地收集垃圾。

line.endXProperty().bind(Bindings.selectDouble(pointedToNode, "layoutX")); 

我推薦EasyBind方法,或者,如果你不希望使用第三方庫由於某種原因,只是用「手」監聽方式在第一代碼塊。

可見性,只是做

line.visibleProperty().bind(pointedToNode.isNull());