【发布时间】:2015-09-17 20:45:27
【问题描述】:
在 JavaFX 中获取节点绝对位置的最佳方法是什么?
假设我们在窗格(Hbox、Stackpane 或任何其他窗格)中有一个节点,并且它本身可能有一个父节点。
我想获取该节点的绝对位置并在另一个窗格中使用它。
【问题讨论】:
标签: java javafx javafx-2 javafx-8
在 JavaFX 中获取节点绝对位置的最佳方法是什么?
假设我们在窗格(Hbox、Stackpane 或任何其他窗格)中有一个节点,并且它本身可能有一个父节点。
我想获取该节点的绝对位置并在另一个窗格中使用它。
【问题讨论】:
标签: java javafx javafx-2 javafx-8
这在一定程度上取决于您所说的“绝对”是什么意思。节点有一个坐标系,其父级有一个坐标系,其父级有一个坐标系,依此类推,最终有一个坐标系用于Scene 和一个用于屏幕(可能是物理显示设备的集合) )。
您可能想要相对于Scene 的坐标,在这种情况下您可以这样做
Bounds boundsInScene = node.localToScene(node.getBoundsInLocal());
或相对于屏幕的坐标:
Bounds boundsInScreen = node.localToScreen(node.getBoundsInLocal());
在任何一种情况下,生成的 Bounds 对象都有 getMinX()、getMinY()、getMaxX()、getMaxY()、getWidth() 和 getHeight() 方法。
【讨论】:
minX、minY、width 和height 将是该用例中最重要的属性, maxX 和 maxY 次之。 centerX 和 centerY 可能没有足够的理由从其他人中计算它们已经足够容易了。
getCenterX() 等方法。
假设主舞台“窗口”的名称,以及节点“菜单”的名称,您可以这样做:-)
double X=Main.window.getX()+menu.getLayoutX();
double Y=Main.window.getY()+menu.getLayoutY();
【讨论】:
如果您想将本地坐标转换为场景坐标,您可以使用 localToScene 方法。
Point2D point2D = node.localToScene(0,0);
例如,如果您想知道窗格的中心但在场景坐标中
Point2D point2D = pane.localToScene(pane.getWidth()/2,pane.getHeight()/2);
【讨论】: