【问题标题】:JavaFX how to overlap a shape onto anotherJavaFX如何将一个形状重叠到另一个上
【发布时间】:2017-07-14 06:25:46
【问题描述】:

我正在尝试在圆的顶部创建一条线。

我尝试过的事情:

  • 我将圆圈添加到 StackPane,然后将 StackPane 和线条添加到我发送给场景构造函数的组中得到了一些不想要的结果,例如 stackpane 没有在舞台上完全展开

  • 在圆圈之后添加线会自动将其置于其上方,但我需要对其进行更多控制。

例如,我有 10 个形状,我想将它们全部声明,然后决定什么超过什么,我不想担心按顺序添加它们

【问题讨论】:

  • 看看这个Z-Order。只需将Nodes 添加到Pane 或Group 并设置它们的位置就可以了。如果您希望所有Nodes 居中并相互重叠,请将所有Nodes 添加到StackPane。

标签: java javafx


【解决方案1】:

JavaFX 如何绘制

JavaFX 使用Painter's algorithm,按照从头到尾的顺序绘制Parent 节点的children,这样最后的节点将被绘制在第一个节点之上。

这是在每个pulse 上的retained mode 而不是immediate mode 中完成的。因此,在您将逻辑控制权交给 JavaFX 图形系统之前,不会绘制项目。这意味着您可以将项目添加到场景图中,然后在绘制它们之前根据需要在场景图中重新排序或移动它们。

JavaFX 中的 3D 绘画也可以使用 Z-buffering,但这个答案只涉及具有相同 z 坐标值的元素的 2D 绘画,没有 Z 缓冲。

如何设置节点的绘制顺序

通过将节点添加到父节点的子列表中,您可以将节点放置在 Group 父节点或 Pane 父节点中。节点将按照您将它们添加到子列表的顺序进行绘制。

如果您希望使用 CSS,则窗格是不错的选择,否则通常使用组。窗格还具有可调整大小的范围,而组则没有。由于这些原因,我通常更喜欢使用窗格而不是组。

要更改子项的绘制顺序,您可以在子项列表中移动节点。

例如,以下代码将改变父窗格子列表中第一项和第五项的绘制顺序:

Collections.swap(parentPane.getChildren(), 0, 4)

此外,Node 有 toFront 和 toBack 方便的方法来将节点移动到节点的父子列表的后面或前面。

关于布局窗格使用的建议

不要使用 StackPane 等布局窗格来保存您希望明确定位的节点。托管布局窗格(如 StackPane)旨在根据布局窗格的内部算法为您自动处理节点布局。例如,默认情况下,您添加到 StackPane 的每个节点都将位于 StackPane 的中间。

相关

【讨论】:

  • "按从头到尾的顺序绘制父节点的子节点,以便最后一个节点将被绘制在第一个节点之上。" 如果我​​没记错的话,从技术上讲仅绘制形状的未覆盖部分以节省绘制操作。首先计算脏区,并在同一个绘制周期中绘制所有形状,以区分绘制在另一个上的一个形状。
  • 是的,JavaFX 实现中内置了针对脏区的性能优化,但它们只是优化,结果保持不变。
猜你喜欢
  • 1970-01-01
  • 2017-12-10
  • 2021-10-21
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多