如何在 JavaFX 中获取父级中的所有节点?

2022-09-04 07:48:27

在C#中,我发现了一个非常可爱的方法,它允许您从指定的控件中获取所有后代及其所有后代。

我正在寻找一种类似的JavaFX方法。

我看到该类是我想要使用的,因为它是所有带有子级的Node类的派生。Parent

这就是我到目前为止所拥有的(我还没有在谷歌上找到任何像“JavaFX从场景中获取所有节点”这样的搜索):

public static ArrayList<Node> GetAllNodes(Parent root){
    ArrayList<Node> Descendents = new ArrayList<>();
    root.getChildrenUnmodifiable().stream().forEach(N -> {
        if (!Descendents.contains(N)) Descendents.add(N);
        if (N.getClass() == Parent.class) Descendents.addAll(
            GetAllNodes((Parent)N)
        );
    });
}

那么我如何判断N是父级(还是从父级扩展而来)呢?我做得对吗?它似乎不起作用...它从根(父)节点获取所有节点,但不从包含子节点的节点中抓取。我觉得这可能是一个答案,但我只是在问这个问题......错。我该怎么做?


答案 1
public static ArrayList<Node> getAllNodes(Parent root) {
    ArrayList<Node> nodes = new ArrayList<Node>();
    addAllDescendents(root, nodes);
    return nodes;
}

private static void addAllDescendents(Parent parent, ArrayList<Node> nodes) {
    for (Node node : parent.getChildrenUnmodifiable()) {
        nodes.add(node);
        if (node instanceof Parent)
            addAllDescendents((Parent)node, nodes);
    }
}

答案 2

我用这个,

public class NodeUtils {

    public static <T extends Pane> List<Node> paneNodes(T parent) {
        return paneNodes(parent, new ArrayList<Node>());
    }

    private static <T extends Pane> List<Node> paneNodes(T parent, List<Node> nodes) {
        for (Node node : parent.getChildren()) {
            if (node instanceof Pane) {
                paneNodes((Pane) node, nodes);
            } else {
                nodes.add(node);
            }
        }

        return nodes;
    }
}

用法

List<Node> nodes = NodeUtils.paneNodes(aVBoxOrAnotherContainer);

此源代码使用现有节点的引用。它不会克隆它们。


推荐