如何在JavaFX中获取场景中的所有节点?

Wil*_*ill 10 java recursion javafx javafx-8

在C#中,我找到了一个非常好的方法,它允许你从指定的控件中获取所有后代和所有的后代.

我正在为JavaFX寻找类似的方法.

我看到Parent该类是我想要使用的类,因为它是从中派生所有带子项的Node类的类.

这就是我到目前为止(我还没有真正在谷歌上找到任何搜索,比如"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)
        );
    });
}
Run Code Online (Sandbox Code Playgroud)

那么如何判断N是父母(或从父母延伸)?我这样做了吗?它似乎没有工作......它从根(父)节点抓取所有节点,但不从其中包含子节点的节点抓取.我觉得这可能是一个答案,但我只是问这个问题......错了.我该怎么做呢?

Han*_*nde 16

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @kleopatra你不必执行任何测试来实现n`add`操作+ m`arraycopy`操作+ m`新的ArrayList()`操作(m> 0)将比n`add`操作执行更长的时间+ 0`arraycopy` operations + 0`new ArrayList()`operations,ceteris paribus.我相信除非你正在处理大量数据,否则它根本不会产生太大的影响.但是欢迎你自己衡量一下这个差异,然后回答一些有建设性的话:-) (7认同)