2015-06-04 67 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());