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