8

シーンのコントロールをループするにはどうすればよいですか? getChildrenUnmodifiable() を試しましたが、最初のレベルの子のみが返されます。

public void rec(Node node){

    f(node);

    if (node instanceof Parent) {
        Iterator<Node> i = ((Parent) node).getChildrenUnmodifiable().iterator();

        while (i.hasNext()){
            this.rec(i.next());
        }
    }
}
4

3 に答える 3

9

これは、私が使用しているamru の回答の修正版です。このメソッドは、特定のタイプのコンポーネントを提供します。

private <T> List<T> getNodesOfType(Pane parent, Class<T> type) {
    List<T> elements = new ArrayList<>();
    for (Node node : parent.getChildren()) {
        if (node instanceof Pane) {
            elements.addAll(getNodesOfType((Pane) node, type));
        } else if (type.isAssignableFrom(node.getClass())) {
            //noinspection unchecked
            elements.add((T) node);
        }
    }
    return Collections.unmodifiableList(elements);
}

すべてのコンポーネントを取得するには:

List<Node> nodes = getNodesOfType(pane, Node.class);

ボタンのみを取得するには:

List<Button> buttons= getNodesOfType(pane, Button.class);
于 2015-07-09T18:02:02.373 に答える
8

再帰的にスキャンする必要があります。例えば:

private void scanInputControls(Pane parent) {
    for (Node component : parent.getChildren()) {
        if (component instanceof Pane) {
            //if the component is a container, scan its children
            scanInputControls((Pane) component);
        } else if (component instanceof IInputControl) {
            //if the component is an instance of IInputControl, add to list
            lstInputControl.add((IInputControl) component);
        }
    }
}
于 2012-10-22T12:37:34.213 に答える