gpt4 book ai didi

java - 将属性绑定(bind)到 ObjectProperty 的属性

转载 作者:行者123 更新时间:2023-12-02 04:36:51 26 4
gpt4 key购买 nike

我正在尝试创建一条指向属性中节点的线:

ObjectProperty<Node> pointedToNode = new SimpleObjectProperty();

我想要一条线像这样指向它:

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

问题在于,当 pointedToNode 发生变化时,绑定(bind)值 (pointedToNode.get()) 发生变化,并且 layoutXProperty() > 不再有效。

如果 pointedToNode 的值为 null,我还需要该线不可见。

我尝试了一些自定义双重绑定(bind),但没有成功。

最佳答案

使用普通 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());

关于java - 将属性绑定(bind)到 ObjectProperty 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30643074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com