Java 将属性绑定到ObjectProperty';s属性

Java 将属性绑定到ObjectProperty';s属性,java,javafx,Java,Javafx,我试图画一条线,指向属性中的节点: ObjectProperty<Node> pointedToNode = new SimpleObjectProperty(); 这方面的问题是当pointedToNode更改时,绑定值(pointedToNode.get())已更改,并且layoutXProperty()不再有效 如果pointedToNode的值为null,我还需要该行不可见 我尝试了一些自定义双绑定,但没有成功。使用普通API: ChangeListener<Numb

我试图画一条线,指向属性中的节点:

ObjectProperty<Node> pointedToNode = new SimpleObjectProperty();
这方面的问题是当
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);
    }
});
您可以尝试使用
绑定。选择
(标准)API,它看起来有点像EasyBind,但有几个缺点:它不能优雅地处理“链”中的
null
值(即如果
pointedToNode.get()
null
);它是不安全的;而且它很容易过早地进行垃圾收集

line.endXProperty().bind(Bindings.selectDouble(pointedToNode, "layoutX"));
我建议使用EasyBind方法,或者,如果出于某种原因不想使用第三方库,只需在第一个代码块中使用“手动”侦听器方法

为了可见性,只需执行以下操作

line.visibleProperty().bind(pointedToNode.isNull());
line.endXProperty().bind(Bindings.selectDouble(pointedToNode, "layoutX"));
line.visibleProperty().bind(pointedToNode.isNull());