javafx - 如何将线绑定到JavaFX中另一个节点内的圆圈?
问题描述
我创建了一个自定义节点(这只是一个 VBox 派生节点),它在右侧和左侧包含两个套接字(圆圈)。
目的是通过将套接字拖动到另一个套接字来连接它们,并且它们之间应该画一条线。
在这里,当在其中一个上检测到拖动时,我只是获取鼠标 x 和 y 位置并在套接字之间绘制线。这很简单,但是当我移动节点时会出现问题。
那就是线没有绑定到套接字(圆圈)。当我尝试将它们绑定到套接字(圆)centerX 和 centerY 位置时,它们绑定不正确,因为 centerX 和 centerY 位置是根据 VBox 而不是 AnchorPane 返回的。我将我的自定义节点添加到 AnchorPane 并且在其上也绘制了线条。所以这是问题圆圈在 VBox 内,而线条在 AnchorPane 内。
当他们有不同的父母时,如何绑定圆和线?(我严格希望他们受到约束)
解决方案
我唯一能做的就是使用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
,是相对于其父级的圆心。对于控件,它将是最左上角的坐标,但不确定。
推荐阅读
- javascript - Qualtrics 和 Javascript - 将单词随机插入句子
- html - 解析csv文件,如何确定日期列格式?
- mysql - 有没有办法将 JSON 字段中的数组与 MySQL 中的 JSON_ARRAY 进行比较?
- java - 使用 Apache Camel 从另一个 API 使用 JSON 并将其写入 CSV
- sql - 如何使用 postgres 获取日期
- bokeh - 散景:使用矩形字形、宽度和 x 共享
- python - Berkeley PacMan 项目中的 Tkinter 问题 - tkinter.TclError: no display name and no $DISPLAY environment variable
- c++ - 任务是找到一个总和最大的子序列,这样子序列中的数组中不应该有相邻的元素
- hyperledger-fabric - 我们可以在连接配置文件中使用定义的排序器覆盖发现的排序器吗?
- java - 如何将 http 请求回滚到将数据保存到 db 的 api 端点