将 属性 绑定到 ObjectProperty 的 属性
Bind property to ObjectProperty's property
我正在尝试制作一条指向 属性 中的节点的线:
ObjectProperty<Node> pointedToNode = new SimpleObjectProperty();
我想要一条线像这样指向它:
line.endXProperty().bind(pointedToNode.get().layoutXProperty());
问题是当pointedToNode
改变时,绑定值(pointedToNode.get()
)改变了,layoutXProperty()
不再有效。
如果 pointedToNode
的值为 null,我还需要该行不可见。
我尝试了一些自定义双重绑定但没有成功。
使用普通 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
中的值"chain"(即如果 pointedToNode.get()
是 null
);它不是类型安全的;并且很容易过早地进行垃圾回收。
line.endXProperty().bind(Bindings.selectDouble(pointedToNode, "layoutX"));
我推荐 EasyBind 方法,或者,如果您出于某种原因不想使用第三方库,只需在第一个代码块中使用 "by hand" 侦听器方法。
为了能见度,只需要
line.visibleProperty().bind(pointedToNode.isNull());
我正在尝试制作一条指向 属性 中的节点的线:
ObjectProperty<Node> pointedToNode = new SimpleObjectProperty();
我想要一条线像这样指向它:
line.endXProperty().bind(pointedToNode.get().layoutXProperty());
问题是当pointedToNode
改变时,绑定值(pointedToNode.get()
)改变了,layoutXProperty()
不再有效。
如果 pointedToNode
的值为 null,我还需要该行不可见。
我尝试了一些自定义双重绑定但没有成功。
使用普通 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
中的值"chain"(即如果 pointedToNode.get()
是 null
);它不是类型安全的;并且很容易过早地进行垃圾回收。
line.endXProperty().bind(Bindings.selectDouble(pointedToNode, "layoutX"));
我推荐 EasyBind 方法,或者,如果您出于某种原因不想使用第三方库,只需在第一个代码块中使用 "by hand" 侦听器方法。
为了能见度,只需要
line.visibleProperty().bind(pointedToNode.isNull());