【问题标题】:Get real position of a node in JavaFX在JavaFX中获取节点的真实位置
【发布时间】:2015-09-17 20:45:27
【问题描述】:

在 JavaFX 中获取节点绝对位置的最佳方法是什么?

假设我们在窗格(Hbox、Stackpane 或任何其他窗格)中有一个节点,并且它本身可能有一个父节点。

我想获取该节点的绝对位置并在另一个窗格中使用它。

【问题讨论】:

    标签: java javafx javafx-2 javafx-8


    【解决方案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 和提供足够的功能之间总是存在平衡。我的猜测(这是一个猜测)是边界最重要的用例是布局,我可以想象minXminYwidthheight 将是该用例中最重要的属性, maxXmaxY 次之。 centerXcenterY 可能没有足够的理由从其他人中计算它们已经足够容易了。
    • @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);
      

      【讨论】:

        猜你喜欢
        • 2015-01-03
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 2011-10-28
        相关资源
        最近更新 更多