【问题标题】:JavaFX 2.2 get node at coordinates (visual tree hit testing)JavaFX 2.2 在坐标处获取节点(可视树命中测试)
【发布时间】:2013-01-03 10:35:10
【问题描述】:

如何获得鼠标/任意坐标下的控件列表(或第一个)?我知道 WPF 有 VisualTreeHelper.HitTest 并且它有一个回调,可用于过滤掉某个点的所有控件。 JavaFX有类似的东西吗? (或者不同,我只关心给定点的第一个元素)我已经看到很多信息来获取节点的坐标,但没有关于如何通过坐标获取节点的信息。

【问题讨论】:

    标签: java javafx-2


    【解决方案1】:

    2021 年 12 月更新

    答案中提到的 impl_pickNode 函数已被删除并替换为替代选择功能。

    javafx.scene.Scene 源码中演示了类似的功能,其中有一个函数仅用于测试 JavaFX 系统:

    /**
     * Note: The only user of this method is in unit test: PickAndContainTest.
     */
    Node test_pick(double x, double y) {
        inMousePick = true;
        PickResult result = mouseHandler.pickNode(new PickRay(x, y, 1,
                Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY));
        inMousePick = false;
        if (result != null) {
            return result.getIntersectedNode();
        }
        return null;
    }
    

    此功能仍然是 JavaFX 系统中的私有功能,它不作为受支持的公共 API 公开。所以 JavaFX 内部知道如何做到这一点,如果您愿意调查内部源代码并使用内部 API,打破模块化并损害向后兼容性,那么您可能会得到结果。


    你可以使用node.impl_pickNode(x,y)

    来自impl_pickNode 方法的文档(从source 复制)。

    /** 
     * Finds a top-most child node that contains the given coordinates.
     *
     * Returns the picked node, null if no such node was found.
     *
     * @deprecated This is an internal API that is not intended for use 
     *             and will be removed in the next version. 
     **/
    public final Node impl_pickNode(double parentX, double parentY)
    

    请仔细注意评论中的弃用警告,使用风险自负。

    更新

    JavaFX 问题跟踪器中有一个现有的功能请求:FX should provide a Parent.pick() routine。此功能请求适用于将来不会弃用的公共采摘 API。请求的功能描述为:“例程可以返回单个节点或鼠标下方所有节点的列表 按 z 坐标排序”。该功能直到“Van Ness”版本才计划实施,该版本是初始 JDK8 版本之后的版本(即该功能最早要到 2013 年圣诞节才可用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多