2012-10-22 13 views
7

Wie kann ich die Steuerelemente der Szene durchlaufen? Ich versuchte mit getChildrenUnmodiable(), aber es gibt nur die erste Ebene der Kinder zurück.JavaFX Looping über Scenegraph-Steuerelemente

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()); 
     } 
    } 
} 

Antwort

8

Sie müssen rekursiv scannen. Zum Beispiel:

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); 
     } 
    } 
} 
3

Hier ist eine modifizierte Version von amru's answer die ich benutze diese Methode, um die Komponenten eines bestimmten Typs gibt:

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); 
} 

Um alle Komponenten zu erhalten:

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

Nur Tasten erhalten:

List<Button> buttons= getNodesOfType(pane, Button.class);