JavaFX - StackPane的X,Y坐标

11
我正在使用StackPane作为我的图形、面板等的容器。我发现坐标X,Y(0,0)位于我的面板中心。
有没有可能将它移动到Pane的左上角? 从中心计算所有尺寸要困难得多。
2个回答

20

您可以使用StackPane.setAlignment(node, position)方法将添加到StackPane的节点的布局设置为StackPane内的位置:

Label topLeftLabel = new Label("Top Left");
StackPane stack = new StackPane();
stack.getChildren().add(topLeftLabel);

StackPane.setAlignment(topLeftLabel, Pos.TOP_LEFT);

虽然这是可能的,但从你简要描述的如何使用 StackPane 的方式来看,你最好使用一个普通的 Pane,或者一个 Group 或者一个 AnchorPane 来实现你想要达到的绝对定位。

你也可以考虑使用可视化工具,例如SceneBuilder。即使你最终不使用它输出的 FXML,SceneBuilder 也应该能让你更好地了解 JavaFX 布局机制的工作原理。SceneBuilder 使用 AnchorPane 作为其默认布局面板来为元素提供绝对定位(这似乎是你想要实现的功能)。



我遇到了同样的问题。不过,我更喜欢使用StackPane,因为我想把东西放在顶部。我该如何在仍然精确定位它们的情况下叠加节点? - qwerty
2
按照你希望它们绘制的顺序将节点放在子列表中。所有布局面板都在2D空间中定位,而不是3D空间。所有面板以子列表中的顺序覆盖节点。JavaFX使用画家算法按此顺序呈现节点。此外,如果启用了深度排序和3D,则可以设置Z坐标,但这不是常见情况。参见:如何将形状叠加到另一个形状上 - jewelsea
2
为了将节点放置在您喜欢的位置,您可以使用标准的Pane、AnchorPane或Group。这些节点允许对项目进行绝对定位,而不是StackPane执行相对定位,通常在中心,但如果您设置了子节点的alignment,则也可以到侧面或角落。 - jewelsea

0

在这种情况下,前面的答案当然是最好的选择,但也明智知道你可以使用平移来移动 StackPane 上的节点。

例如:

    Label topLeftLabel = new Label("Top Left");
    StackPane stack = new StackPane();
    stack.getChildren().add(topLeftLabel);
    
    topLeftLabel.setTranslateX(stack.getWidth()/2);
    topLeftLabel.setTranslateY(stack.getHeight()/2);

它会做同样的事情(但可能看起来更糟)


如果使用 stackPane.setAlignment(Pos.TOP_LEFT);,那么标签的相对位置将基于左上角计算为 (0, 0)。 - Nick Dong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接