首页 > 解决方案 > 行开始/结束到嵌套的 javafx 组/窗格

问题描述

我有某种可视化元素,这些元素具有可以相互连接的端口。元素的端口是表示元素的 javafx 窗格的子项。我现在想知道将连接线的起点和终点绑定到端口位置的最佳方法是什么,因为端口可能位于元素层次结构的深处。这就是为什么我认为我可能需要这些端口的绝对位置,但没有找到一种简单的方法来获得它们。现在,这些线条直接位于场景根目录下。

标签: javafx

解决方案


如果没有看到代码的结构,很难说。但是我在使用 javafx 编写的 uml 建模工具时遇到了类似的问题,所以我的解决方案可能会对您有所帮助。

所以在你的情况下,我会做这样的事情:

  1. Port以他们对 X 和 Y 位置的方式实现DoubleProperty,现在取决于它应该如何实现可能会有所不同,在我的情况下,我使用Circleand 它的centerXPropertyand centerYProperty,如果使用某些矩形形状的另一个选项是创建自己的centerXPropertyand centerYProperty,他们可以通过绑定到layoutX+ ( width/ 2) 非常容易计算,对于 y 仅使用高度也是如此。它应该看起来像这样:

    DoubleProperty centerXProperty = new SimpleDoubleProperty(0); centerXProperty.bind(n.layoutXProperty().add(n.widthProperty().divide(2)));

    n场景图上的某个节点在哪里prefWidthProperty,如果您使用自定义宽度/高度 ,您也可以使用

  2. 您的窗格应该有所有端口的列表,现在取决于您要如何制作Port它可能会有所不同,但在我的项目中,我将在该用户绘制Port的交叉点上创建它并连接到,您也可以只在每个并且仅当端点在半径内时才建立连接。 LinePanePortsPaneLinePort

  3. Line 已经有了endXPropertyendYProperty因此您可以简单地将它们绑定到您的位置属性Port,这样您就可以轻松地将它们一起移动。

如果您需要代码示例,那么您需要提供到目前为止所获得的内容,以便我可以帮助您。

编辑

关于父子关系,我们对图根的解决方案是扩展锚窗格,因为他将大部分控制权交给了它的孩子,这个锚窗格上的每个节点都必须是UmlElement,它进一步向下传播到UmlNodeUmlEdge然后UmlNode具有子类型ParentUmlNodeChildUmlNodeChild可以放在里面Parent,位置是绑定Parent位置的,外面不关心,因为一Parent动他的孩子就跟着他。

恕我直言,这比根据视图根处理深层子位置要好得多,因为保持一切同步可能会出现一些问题,特别是如果您添加调整大小、多选和类似的更复杂的功能。


推荐阅读