将属性绑定到ObjectProperty的属性

时间:2015-06-04 11:49:30

标签: java javafx

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

base64encode(username:password) == dXNlcm5hbWU6cGFzc3dvcmQ=

我想要一条线指向它:

ObjectProperty<Node> pointedToNode = new SimpleObjectProperty();

问题在于line.endXProperty().bind(pointedToNode.get().layoutXProperty()); 发生变化,绑定值(pointedToNode)发生了变化,pointedToNode.get()不再有效。

如果layoutXProperty()的值为null,我还需要该行不可见。

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

1 个答案:

答案 0 :(得分:2)

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