首页 > 解决方案 > 如何将线绑定到JavaFX中另一个节点内的圆圈?

问题描述

我创建了一个自定义节点(这只是一个 VBox 派生节点),它在右侧和左侧包含两个套接字(圆圈)。

带有 IO 套接字的自定义节点

目的是通过将套接字拖动到另一个套接字来连接它们,并且它们之间应该画一条线。

拖线后连接的自定义节点

在这里,当在其中一个上检测到拖动时,我只是获取鼠标 x 和 y 位置并在套接字之间绘制线。这很简单,但是当我移动节点时会出现问题。

将自定义节点与线连接后移动

那就是线没有绑定到套接字(圆圈)。当我尝试将它们绑定到套接字(圆)centerX 和 centerY 位置时,它们绑定不正确,因为 centerX 和 centerY 位置是根据 VBox 而不是 AnchorPane 返回的。我将我的自定义节点添加到 AnchorPane 并且在其上也绘制了线条。所以这是问题圆圈在 VBox 内,而线条在 AnchorPane 内。

当他们有不同的父母时,如何绑定圆和线?(我严格希望他们受到约束)

标签: javafxbinding

解决方案


我唯一能做的就是使用localToSceneTransform属性计算项目的场景 X 和 Y 坐标,并将这些值用作线的起点/终点。

这是一些示例代码:

...
Line line = new Line();
line.setStroke(Color.BLACK);
line.setStrokeWidth(5.0);

Circle start = new Circle();
Pane startWrapper = new Pane();
startWrapper.getChildren().add(start);

Circle end = new Circle();
Pane endWrapper = new Pane();
endWrapper.getChildren().add(end);

start.localToSceneTransformProperty().addListener((_observable, _old, _new) -> {
   Point2D posInScene = _new.transform(0, 0);

    line.setStartX(posInScene.getX());
    line.setStartY(posInScene.getY());
});

end.localToSceneTransformProperty().addListener((_observable, _old, _new) -> {
   Point2D posInScene = _new.transform(0, 0);

    line.setEndX(posInScene.getX());
    line.setEndY(posInScene.getY());
});
...

工作原理:每当您拖动父级(不是圆形)时,属性localToSceneTransform都会更新,这将为您提供有关圆形变换的新信息(注意:圆形相对于父级仍然具有相同的坐标,但对于场景会有不同的坐标)

它也将涵盖无限嵌套问题

这是使用此代码段的应用程序的屏幕截图

截屏

你可能会问“为什么我需要使用 0 in _new.transform(0, 0);”。问题是您仍然需要使用圆形局部点(同一父级内的相对点,这就是它被称为的原因localToSceneTransform)。在这种情况下0,是相对于其父级的圆心。对于控件,它将是最左上角的坐标,但不确定。


推荐阅读