Evento para adicionar elementos no layout JavaFX e FXML

3 respostas
tiagomourabrandao

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

Classe Ui

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

			}
		});





	}

}

Obrigado!

3 Respostas

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:

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

Espero que ajude! :D

Té mais!

tiagomourabrandao
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:

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

Espero que ajude! :D

Té mais!

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

Valkyrium
tiagomourabrandao:
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:

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

Espero que ajude! :D

Té mais!

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

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:

@FXML
private Group group;

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

Qualquer dúvida, tou aqui! :D

Criado 4 de abril de 2013
Ultima resposta 15 de abr. de 2013
Respostas 3
Participantes 2