使用简单的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());