5

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

4

1 回答 1

3

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复制)。

/** 
 * 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 应该提供 Parent.pick() 例程。此功能请求适用于将来不会弃用的公共采摘 API。请求的功能描述为:“例程可以返回单个节点或鼠标下方按 z 坐标排序的所有节点的列表”。该功能直到“Van Ness”版本才计划实施,这是最初 JDK8 版本之后的版本(即该功能最早要到 2013 年圣诞节才可用)。

于 2013-01-20T05:35:33.487 回答