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?
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.