Passagem de Parâmetros entre Controllers JAVAFX

Olá srs. Estou com algumas dúvidas sobre passar parâmetro entre controllers, vou postar meu código e explicar… Em uma tela simples eu tenho uma tabela com informações do Banco de Dados, ao clicar na linha da tabela desejada eu carrego aquela informação no textField que está em outra tela. Ou seja, a tabela está em um controller e o textField está em outro. Para passar o parâmetro eu usei o seguinte código.

Código do Controller da tableView. - Apaguei os códigos que ñ eram importante para o tópico…

package controller.administrativo;

public class FXMLconsultaEmpresaController implements Initializable {
    
    public static FXMLconsultaEmpresaController consultaEmpresaController; //Variavel estatica do proprio controller

@Override
    public void initialize(URL url, ResourceBundle rb) {
        
        consultaEmpresaController = this; //Aqui eu inicio a variavel criada acima, assim eu consigo acessar qualquer metodo da classe em qualquer outra classe.
        
        carregarTabelaBancoDados(); //chamando os dados do banco e populando a tableView assim que abre a tela
    }
    
//Metodo para popular a tableView com informacoes do Banco de Dados, está operacional!
    public void carregarTabelaBancoDados(){
        ArrayList<Empresa> lista = dao.listaTabela();
        ObservableList<TabelaEmpresa> observableList = FXCollections.observableArrayList();
        
        colCodigo.setCellValueFactory(new PropertyValueFactory<>("id"));
        colRazaoSocial.setCellValueFactory(new PropertyValueFactory<>("razaoSocial"));
        colCNPJ.setCellValueFactory(new PropertyValueFactory<>("cnpj"));
        
        if(!observableList.isEmpty()){
            observableList.clear();
            System.out.println("Tabela Limpa");
        }
        lista.stream().map((c) -> new TabelaEmpresa(
                c.getId() , 
                c.getRazaoSocial() ,
                c.getFk_documento()
        )).forEachOrdered((m) -> {
            observableList.add(m);
        });
        tblEmpresa.setItems(observableList);
        btnCarregar.setDisable(false);
    }

//Botao que carrega a informação selecionada manda para o outro controller
    @FXML
    private void carregarInformacaoEmpresa(){
        if(tblEmpresa.getSelectionModel().getSelectedItem() == null){
            JOptionPane.showMessageDialog(null , "Selecione um ítem na tabela para carregar a informação!");
            return;
        }else{
            Integer id = tblEmpresa.getSelectionModel().getSelectedItem().getId();
            String empresa = tblEmpresa.getSelectionModel().getSelectedItem().getRazaoSocial();
            String cnpj = tblEmpresa.getSelectionModel().getSelectedItem().getCnpj();

             //Aqui eu faço uma instancia do controller que eu e chamo o metodo para passar as informacoes e conforme os parametros e fecho a janela
           FXMLcadastroEmpresaController.cadastroEmpresaController.receberParametroEmpresa(id , empresa , cnpj);
            Stage stage = (Stage) btnFechar.getScene().getWindow();
            stage.close();
        }
    }
//Fima da Classe
}

Agora vou mostrar a classe que recebe os parametros da Classe FXMLconsultaEmpresaController: - Mais uma vez, vou apagar os codigos inuteis à duvida…

package controller.financeiro;

public class FXMLcadastroEmpresaController implements Initializable {
     //Aqui está o metodo chamado no Controller acima, recebendo os parametros pegos na tableView setados nas variaveis e jogando pra, e cada textField recebe essas varias e seta nos campos.
    public void receberParametroEmpresa(Integer id , String empresa , String cnpj){
           txtCodigoEmpresaCompradora.setText(String.valueOf(id));
           txtRazaoSocialEmpresaCompradora.setText(empresa);
           lblCnpjEmpresaCompradora.setText(cnpj);
           txtCodigoFornecedor.requestFocus();
     }
//Fim da Class
}

Tudo funciona, informações sendo carregadas na tableView, selecionar o item na tabela e passar o parâmetro para o outro controller, tudo está indo…

Minhas dúvidas são as seguintes.
1 - Esse método de passagem de parâmetros é usual? ou é apenas uma “gambiarra”?
2 - Caso eu precise passar esses mesmos parâmetros para um segundo controller, como eu faria para tratar essa condição no controller da tableView para passar as informações a vários controllers?

Espero ter sido claro na dúvida e desde já agradeço os conselhos e ajuda! :vulcan_salute:

Sim é usual, principalmente estando em um Controller e precisando chamar outro Controller.
todavia em todos os Controller(s) é bom ter um metodo que receba a instancia da Aplicação Principal.

Cada Controller tem sua independencia e é especifico para cada Tela, então se ele precisa de parametros para entrar em açao, a forma é atraves de um metodo que receba esses parametros ou de fora setando as variaveis publicas ou protegidas no mesmo pacote.

Mas a questão toda é que você precisa passar os parametros fora da initialize e pra isso cria um metodo, ou seja, primeiro instancia o fxml dá um getController e passa os Parametros.
---------------------->

Você sempre deve pensar em faze de uma forma diferente quando o resultado não esteja satisfatorio.

Vejo que você usou JOptionPane do Swing, mas não é necessario, no JavaFX voce pode usar Dialog, mesmo porque Swing dentro do JavaFX o deixa um pouco mais lento.

Isso não é uma critica ao Swing que alias funciona muito bem, sozinho.

1 curtida

J-menezes grato pelos seus conselhos, vou continuar então os estudos sobre o tema e ampliar mais meus conhecimentos… quanto jOptionPane é apenas costume, mas tbm grato pela dica!..

1 curtida