Como acessar um filho no JavaFX?

1 resposta
javafx
gcherobim

Bom dia. Estou fazendo um trabalho com JavaFX que eu preciso complementar um código inicial já passado. Nesse código eu preciso acessar um Label que é filho de um TitledPane, que por sua vez já é filho de um GridPane, mas não consigo acessar esse Label. Pensei em utilizar a mesma lógica usada para acessar o TitledPane, que foi

this.paneJogadores.getChildren().get(posicaoJogadorAtual)

mas nem ao menos aparece a opção de acessar os filhos deste. Como eu posso proceder?

1 Resposta

j-menezes

Um Filho pode ser encontrado de varias maneiras entre elas
Por Id usando lookup
Label label = (Label) scene.lookup("#oiddobicho");

Buscando dentro da Colecao

int indice = this.paneJogadores.getChildren().indexOf(aReferencidoTaldoNode);

Node node = this.paneJogadores.getChildren().get(indice);

O Filho pode ser acessado apenas pela referencia dele, não precisando toda hora consultar
a getChildren().

Agora se quiser procurar um node qualquer dentro de uma sequencia de Parent(s).
segue um exemplozinho pra vc brincar.

import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author jorge
 */
public class ChildreenFX extends Application {
    
    StackPane stp1 = new StackPane();
    StackPane stp2 = new StackPane();    
    
    BorderPane bp1 = new BorderPane();
    
    Button btn = new Button("Mostra Filhos");
    
    Button btn2 = new Button("Botao");
    
    HBox hbox1 = new HBox(5);
       Label label  = new Label("Idioma");
       Button btn3  = new Button("Portugues");
       Label label2 = new Label("Biblioteca");
       Button btn4  = new Button("JavaFX"); 
    
    @Override
    public void start(Stage primaryStage) {
        
        hbox1.getChildren().addAll(label, btn3,label2, btn4);
       
        
        btn.setOnAction( (e) -> {
            List<Node> nodes = NodeUtils.paneNodes(bp1);
            for(Node node : nodes) {
                System.out.println(node.toString());
            }
        });
         
        stp1.getChildren().add(btn);
        stp2.getChildren().add(btn2);
       
         
        bp1.setTop(stp1);
        bp1.setCenter(stp2);
        bp1.setBottom(hbox1);
        
        Scene scene = new Scene(bp1, 300, 250);
        
        primaryStage.setTitle("Teste Filhos");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
    
    
    
}


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

Outra coisa importante, caso tenha o mesmo filho para varias maes diferentes e precisar exibir eles ao mesmo tempo, dará erro.
Caused by: java.lang.IllegalArgumentException: Children: duplicate children

Nesse caso existe como contornar isso de uma forma muito elegante em JavaFX, que é trabalhando apenas trocando as referencias.

Criado 27 de julho de 2020
Ultima resposta 28 de jul. de 2020
Respostas 1
Participantes 2