【发布时间】:2018-11-13 22:53:45
【问题描述】:
我有某种可视化元素,这些元素具有可以相互连接的端口。元素的端口是表示元素的 javafx 窗格的子项。我现在想知道将连接线的起点和终点绑定到端口位置的最佳方法是什么,因为端口可能位于元素层次结构的深处。这就是为什么我认为我可能需要这些端口的绝对位置,但没有找到一种简单的方法来获得它们。现在,这些线条直接位于场景根目录下。
【问题讨论】:
标签: javafx
我有某种可视化元素,这些元素具有可以相互连接的端口。元素的端口是表示元素的 javafx 窗格的子项。我现在想知道将连接线的起点和终点绑定到端口位置的最佳方法是什么,因为端口可能位于元素层次结构的深处。这就是为什么我认为我可能需要这些端口的绝对位置,但没有找到一种简单的方法来获得它们。现在,这些线条直接位于场景根目录下。
【问题讨论】:
标签: javafx
不看代码结构就很难说。但是我在使用 javafx 编写的 uml 建模工具时遇到了类似的问题,所以我的解决方案可能会对您有所帮助。
所以在你的情况下,我会做这样的事情:
以这样的方式实现Port,使得他们的X和Y位置有DoubleProperty,现在取决于它应该如何实现可能会有所不同,在我的例子中,我使用了Circle和它的centerXProperty和@ 987654326@,如果使用一些矩形形状的另一种选择是创建自己的centerXProperty 和centerYProperty,它们可以通过绑定到layoutX + (width / 2) 来非常容易地计算,对于 y 仅使用高度相同.它应该看起来像这样:
DoubleProperty centerXProperty = new SimpleDoubleProperty(0);
centerXProperty.bind(n.layoutXProperty().add(n.widthProperty().divide(2)));
n 是场景图上的某个节点,如果您使用自定义宽度/高度,您也可以使用 prefWidthProperty
Pane,您也可以在每个Pane 上放置预定义的Ports,并且仅当Line 端点位于Port 半径内时才进行连接。
Line 已经拥有endXProperty 和endYProperty,因此您可以简单地将它们绑定到Port 的位置属性,这样您就可以轻松地将它们一起移动。
如果您需要代码示例,那么您需要提供到目前为止所获得的内容,以便我可以帮助您。
编辑
关于父子关系,我们对图根的解决方案是扩展锚窗格,因为他将大部分控制权交给了子窗格,该锚窗格上的每个节点都必须是UmlElement,进一步向下扩展到UmlNode和UmlEdge,那么UmlNode有子类型ParentUmlNode和ChildUmlNode,Child可以放在Parent里面,并且它们的位置绑定到Parent位置,它不关心外面,因为一旦Parent 移动,他的孩子们就分别跟着他。
恕我直言,这比根据您的视图根处理深层子位置要好得多,因为在保持一切同步时可能会出现一些问题,尤其是在您添加调整大小、多选和类似的更复杂的功能时。
【讨论】: