【问题标题】:line start/end to nested javafx groups/panes行开始/结束到嵌套的 javafx 组/窗格
【发布时间】:2018-11-13 22:53:45
【问题描述】:

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

【问题讨论】:

    标签: javafx


    【解决方案1】:

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

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

    1. 以这样的方式实现Port,使得他们的X和Y位置有DoubleProperty,现在取决于它应该如何实现可能会有所不同,在我的例子中,我使用了Circle和它的centerXProperty和@ 987654326@,如果使用一些矩形形状的另一种选择是创建自己的centerXPropertycenterYProperty,它们可以通过绑定到layoutX + (width / 2) 来非常容易地计算,对于 y 仅使用高度相同.它应该看起来像这样:

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

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

    2. 1234563和它所连接的Pane,您也可以在每个Pane 上放置预定义的Ports,并且仅当Line 端点位于Port 半径内时才进行连接。
    3. Line 已经拥有endXPropertyendYProperty,因此您可以简单地将它们绑定到Port 的位置属性,这样您就可以轻松地将它们一起移动。

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

    编辑

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

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

    【讨论】:

    • 所以你会说我不应该尝试通过父/子关系来控制我的情况的布局?因为如果端口是元素的子元素,我不需要绑定或添加 layoutXProperty,因为绑定已经相对于父元素。但是后来我没有绝对值,并且出现了我当前的问题。我做了和你一样的“解决方法”,没有父/子关系和绑定例如layoutXProperty 具有绝对定位,但我认为这可能是不好的风格。
    • 不太清楚你在父/子关系下的意思,你能详细说明一下吗?
    • 如果您有一个窗格并通过 getChildren().add(..) 向其中添加一些子节点,则该子节点的 layoutXProperty 将相对于父窗格。在这种情况下,获得这样一个孩子在场景中或相对于某个祖先的绝对位置被证明要困难得多,或者至少我没有看到像 xBindingRelativeTo(Node) 这样的函数。我找到的解决方案与stackoverflow.com/a/31150013/4285113 类似,但我认为这种方法与 x/y 属性的属性绑定不太协调
    猜你喜欢
    • 1970-01-01
    • 2016-07-12
    • 2018-04-13
    • 1970-01-01
    • 2021-04-15
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多