Comment puis-je obtenir tous les nœuds en une scène dans JavaFX?
En C#, j'ai trouvé une méthode qui était assez doux qui vous a permis d'obtenir tous les descendants et tous LEURS descendants à partir d'un contrôle spécifié.
Je suis à la recherche d'une méthode similaire pour JavaFX.
J'ai vu que le Parent
classe est ce que je veux travailler avec, car il est la classe à partir de laquelle tous Nœud classes qui portent les enfants sont dérivés.
C'est ce que j'ai jusqu'à présent (et je n'ai pas vraiment trouvé quelque chose sur google avec des recherches comme "JavaFX obtenir tous les nœuds à partir d'une scène"):
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)
);
});
}
Alors, comment puis-je savoir si N est un parent (ou étendu à partir d'un parent)? Suis-je en train de le faire? Il ne semble pas fonctionner... C'est saisir l'ensemble de nœuds à partir de la racine (parent) nœud, mais pas de les nœuds avec des enfants en eux. J'ai l'impression que c'est quelque chose qui a probablement eu une réponse, mais je ne fais que poser la question... mal. Comment dois-je faire?
OriginalL'auteur Will | 2014-07-27
Vous devez vous connecter pour publier un commentaire.
Il utilise moins de mémoire parce qu'avec la deuxième méthode, vous n'avez pas à créer une nouvelle liste de tableaux chaque fois que la méthode est appelée--vous venez d'ajouter tous les nœuds de la même. Juste de la bonne programmation de la pratique.
la performance est également plus rapide parce que vous éviter les nombreux
arraycopy
opérations qui pourraient survenir si vous avez été constamment à la fusion des listes ensemble. Encore une fois, juste une bonne programmation de la pratique.la performance est également plus rapide Avez-vous mesurer? Si non, c'est rien, mais un sauvage sauvage deviner 🙂
Vous n'avez pas à effectuer de test à réaliser que n
add
opérations + marraycopy
opérations + mnew ArrayList()
exploitation (m > 0) prendra plus de temps pour effectuer de nadd
opérations + 0arraycopy
opérations + 0new ArrayList()
opérations, toutes choses égales par ailleurs. Je suis sûr que ça ne ferait pas beaucoup de différence si vous avez été de travailler avec de grands nombres. Mais vous êtes les bienvenus pour mesurer la différence vous-même et ensuite revenir avec quelque chose de constructif à dire 🙂OriginalL'auteur Hans Brende
Malheureusement cela ne peut pas obtenir des sous-nœuds pour la plupart des composants conteneurs. Si vous essayez un
TabPane
en tant que parent, vous ne trouverez pas les enfants, mais vous pouvez trouver des onglets avecgetTabs()
. La même chose est avecSplitPane
et d'autres. Ainsi, chaque conteneur nécessitent une approche particulière.Vous pouvez utiliser
node.lookupAll("*")
, mais il ne regarde pas aussi à l'intérieur.La solution pourrait être un "Prototype" de modèle la création d'un méta-classe d'interface commune de
getChildren()
méthode, qui est réalisé dans les sous-classes, une pour chaque type.Approche de l'exemple est donné ici.
OriginalL'auteur Zon
J'utilise cela,
D'utilisation,
Ce code source utilise les références des nœuds existants. Il n'est pas de les cloner.
getChildrenUnmodifiable()
au lieu degetChildren()
semble fonctionnerOriginalL'auteur George Siggouroglou
Je voudrais ajouter à Hans réponse, que vous avez pour vérifier si le parent est un
SplitPane
. Parce queSplitPane
s ont une liste vide à l'aide degetUnmodifiableChildren()
, vous aurez à utilisergetItems()
à la place. (Je ne sais pas si il y a d'autres parents qui n'assurent pas leurs enfants par le biais degetUnmodifiableChildren()
.SplitPane
a été le premier que j'ai trouvé...)OriginalL'auteur Helkaruthion
Cela semble TOUS les nœuds.
(En Kotlin)
OriginalL'auteur Red wine
Cela fonctionne pour moi:
OriginalL'auteur Marcel Wieczorek