在JavaFX中获取节点的真实位置
Posted
技术标签:
【中文标题】在JavaFX中获取节点的真实位置【英文标题】:Get real position of a node in JavaFX 【发布时间】:2015-09-17 20:45:27 【问题描述】:在 JavaFX 中获取节点绝对位置的最佳方法是什么?
假设我们在窗格(Hbox、Stackpane 或任何其他窗格)中有一个节点,并且它本身可能有一个父节点。
我想获取该节点的绝对位置并在另一个窗格中使用它。
【问题讨论】:
【参考方案1】:这在一定程度上取决于您所说的“绝对”是什么意思。节点有一个坐标系,其父级有一个坐标系,其父级有一个坐标系,依此类推,最终有一个坐标系用于Scene
和一个用于屏幕(可能是物理显示设备的集合) )。
您可能想要相对于Scene
的坐标,在这种情况下您可以这样做
Bounds boundsInScene = node.localToScene(node.getBoundsInLocal());
或相对于屏幕的坐标:
Bounds boundsInScreen = node.localToScreen(node.getBoundsInLocal());
在任何一种情况下,生成的 Bounds
对象都有 getMinX()
、getMinY()
、getMaxX()
、getMaxY()
、getWidth()
和 getHeight()
方法。
【讨论】:
出于好奇,您知道他们为什么不创建 getCenterX() 和 getCenterY() 方法吗? @Roland 不,不是真的,但是在过度指定 API 和提供足够的功能之间总是存在平衡。我的猜测(这是一个猜测)是边界最重要的用例是布局,我可以想象minX
、minY
、width
和height
将是该用例中最重要的属性, maxX
和 maxY
次之。 centerX
和 centerY
可能没有足够的理由从其他人中计算它们已经足够容易了。
@James_D ...它有时不起作用!为什么?我真的不明白!
@maryam 什么时候不起作用?当它不起作用时会发生什么?您可能应该发布一个新问题,其中包含一个完整、简单的示例,表明它未能达到您的预期。你明白它是如何工作的吗?如果没有,您是否阅读了相关类和方法的 API 文档?
@Roland JavaFX11 添加了getCenterX()
等方法。【参考方案2】:
假设主舞台“窗口”的名称,以及节点“菜单”的名称,您可以这样做:-)
double X=Main.window.getX()+menu.getLayoutX();
double Y=Main.window.getY()+menu.getLayoutY();
【讨论】:
【参考方案3】:如果您想将本地坐标转换为场景坐标,您可以使用 localToScene 方法。
Point2D point2D = node.localToScene(0,0);
例如,如果您想知道窗格的中心但在场景坐标中
Point2D point2D = pane.localToScene(pane.getWidth()/2,pane.getHeight()/2);
【讨论】:
以上是关于在JavaFX中获取节点的真实位置的主要内容,如果未能解决你的问题,请参考以下文章
Javafx:TableView根据行列获取特定表格单元格的图形节点