Evento para adicionar elementos no layout JavaFX e FXML

Olá pessoal! Ainda estou aprendendo as coisas aqui no GUJ e estou gostando muito!

Mas, estou com um problema que não sei como resolver. Estou desenvolvendo uma aplicação desktop para cadastro de contatos e gostaria que o usuário tivesse a liberdade de adicionar quantos telefones e email quisesse para cada contato. Para isso, criei um botão de “+” e, ao clicar neste botão, gostaria que fossem criadas nos Label’s e TextField’s à minha User Interface. Eu sei fazer isso criando todo layout na mão, porém os FXML’s facilitaram, por um lado, muito a criação de interfaces. Gostaria de saber se alguém pode me ajudar.

Obrigado.

Classe Principal

[code]public class Principal extends Application {

public static Stage myStage;

@Override
public void start(Stage estagio) throws IOException {


	Principal.myStage = estagio;
	
	Parent root;
	
	root = FXMLLoader.load(getClass().getResource("Ui.fxml"));
	
	Scene cena = new Scene(root);
	
	estagio.setScene(cena);
	estagio.sizeToScene();
	estagio.show();
	
	
}

public static void main(String[] args) {
	launch(args);
}

}[/code]

Classe Ui

[code]public class Ui implements javafx.fxml.Initializable{

@FXML
private Button plus;

@Override
public void initialize(URL URL, ResourceBundle resources) {
	
	plus.setOnAction(new EventHandler<ActionEvent>() {
		
		@Override
		public void handle(ActionEvent e) {
			
			//não sei o que colocar aqui

		}
	});





}

}
[/code]

Obrigado!

Boa tarde Tiago!

É o seguinte, basta você dar um ID para o AnchorPane principal da sua tela, aí você inicializa ele na classe Initializable, e então você pode criar e/ou alterar componentes dele.

Exemplo:

[code]public class Ui implements javafx.fxml.Initializable{

@FXML  
private Button plus;
@FXML
private AnchorPane mainPane;  
  
@Override  
public void initialize(URL URL, ResourceBundle resources) {  
      
    plus.setOnAction(new EventHandler<ActionEvent>() {  
          
        @Override  
        public void handle(ActionEvent e) {
              // Cria novo Label  
              Label lb = new Label("Telefone:");
              lb.setLayoutX(/* coordenada X */);
              lb.setLayoutY(/* coordenada Y */);
              // Cria novo TextField
              TextField tx = new TextField();
              tx.setLayoutX(/* coordenada X */);
              tx.setLayoutY(/* coordenada Y */);
              // Adiciona os dois componentes no painel principal (mainPane)
              mainPane.getChildren().addAll(lb, tx);
        }  
    });  
}  

}[/code]

Espero que ajude! :smiley:

Té mais!

[quote=Valkyrium]Boa tarde Tiago!

É o seguinte, basta você dar um ID para o AnchorPane principal da sua tela, aí você inicializa ele na classe Initializable, e então você pode criar e/ou alterar componentes dele.

Exemplo:

[code]public class Ui implements javafx.fxml.Initializable{

@FXML  
private Button plus;
@FXML
private AnchorPane mainPane;  
  
@Override  
public void initialize(URL URL, ResourceBundle resources) {  
      
    plus.setOnAction(new EventHandler<ActionEvent>() {  
          
        @Override  
        public void handle(ActionEvent e) {
              // Cria novo Label  
              Label lb = new Label("Telefone:");
              lb.setLayoutX(/* coordenada X */);
              lb.setLayoutY(/* coordenada Y */);
              // Cria novo TextField
              TextField tx = new TextField();
              tx.setLayoutX(/* coordenada X */);
              tx.setLayoutY(/* coordenada Y */);
              // Adiciona os dois componentes no painel principal (mainPane)
              mainPane.getChildren().addAll(lb, tx);
        }  
    });  
}  

}[/code]

Espero que ajude! :smiley:

Té mais![/quote]

Oi Valkyrium! Muito obrigado! Mas o que seria o MainPane? Pode ser simplesmente o Group da minha Scene?

[quote=tiagomourabrandao][quote=Valkyrium]Boa tarde Tiago!

É o seguinte, basta você dar um ID para o AnchorPane principal da sua tela, aí você inicializa ele na classe Initializable, e então você pode criar e/ou alterar componentes dele.

Exemplo:

[code]public class Ui implements javafx.fxml.Initializable{

@FXML  
private Button plus;
@FXML
private AnchorPane mainPane;  
  
@Override  
public void initialize(URL URL, ResourceBundle resources) {  
      
    plus.setOnAction(new EventHandler<ActionEvent>() {  
          
        @Override  
        public void handle(ActionEvent e) {
              // Cria novo Label  
              Label lb = new Label("Telefone:");
              lb.setLayoutX(/* coordenada X */);
              lb.setLayoutY(/* coordenada Y */);
              // Cria novo TextField
              TextField tx = new TextField();
              tx.setLayoutX(/* coordenada X */);
              tx.setLayoutY(/* coordenada Y */);
              // Adiciona os dois componentes no painel principal (mainPane)
              mainPane.getChildren().addAll(lb, tx);
        }  
    });  
}  

}[/code]

Espero que ajude! :smiley:

Té mais![/quote]

Oi Valkyrium! Muito obrigado! Mas o que seria o MainPane? Pode ser simplesmente o Group da minha Scene?[/quote]

Este mainPane é o Parent da sua tela, ou seja, o painel principal… Por exemplo, se você fez o seu layout pelo JavaFX Scene Builder (arquivo FXML), sua tela tem um painel principal, onde contém todos os seus componentes. Porém, se você adiciona o Label e TextField em um Group, pode ser ele também… aí seria:

[code]@FXML
private Group group;

@Override
public void initialize(URL URL, ResourceBundle resources) {
// Demais códigos…
group.getChildren().addAll(lb, tx);
}[/code]

Qualquer dúvida, tou aqui! :smiley: