如何将线绑定到JavaFX中另一个节点内的圆上?

时间:2018-11-20 17:51:19

标签: javafx binding

我创建了一个自定义节点(这只是VBox派生的节点),该节点在左右两侧包含两个插槽(圆圈)。

Custom nodes with IO sockets

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

Custom nodes connected after dragging the line

这里,当在其中一个插座上检测到拖动时,我只是获得鼠标的x和y位置以及在插座之间画线。它很简单,但是当我移动节点时会出现问题。

Custom nodes moved after connecting them with lines

也就是说,这些线未绑定到插槽(圆圈)。当我尝试将它们绑定到套接字(圆)centerX和centerY位置时,它们被错误地绑定,因为根据VBox而不是AnchorPane返回了centerX和centerY位置。我将自定义节点添加到AnchorPane,并且在其上绘制了线条。所以这就是问题圈子在VBox内部,而线在AnchorPane内部。

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

1 个答案:

答案 0 :(得分:0)

我唯一能做的就是使用SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'amenity_db_prod.a.amenity_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: SELECT IF(COUNT(u.id) > 1, GROUP_CONCAT(CONCAT(a.amenity_name, '_' ,a.id)), a.amenity_name) as m_concat, u.id as unit_id, u.building_id, (uav.id) as uav_id, a.* FROM amenities a INNER JOIN amenity_values av ON a.id = av.amenity_id INNER JOIN units_amenities_values uav ON av.id = uav.amenity_value_id INNER JOIN units u ON u.id = uav.unit_id where a.category_id = '370' AND a.property_id = '82' AND u.building_id = '1265' group by u.id order by u.id asc) 属性来计算项目的场景X和Y坐标,并将这些值用作行的起点/终点。

下面是一些示例代码:

localToSceneTransform

工作原理:每当拖动父级(而不是圆)时,属性... 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()); }); ... 都会更新,这将为您提供有关圆的变换的新信息(注意:圆相对于父级仍具有相同的坐标,但具有场景不同)

它将涵盖无限嵌套问题

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

screenshot

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