使用簡單的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());