Mandar Dados para Outras Telas JavaFx

Galera que mexe com javafx, estou precisando muito de ajuda, estou tentando passar dados de um tela para outra só que não consigo, tentei varias formas de fazer,

No meu projeto aqui eu faço login com um usuário buscando no banco de dados ok, cada usuário tem um id, eu preciso que na hora que ele faça o login eu consiga mandar esse Id do usuário para tela principal para poder mexer nas demais coisas com esse id que ira para tela principal.

Eu tenho Login.Controller, login.fxml. login.tela, e o tela principal a mesma coisa, Seguindo o padrão MVC

Nessa parte a baixa eu faço o login, nessa hora eu queria manda o id do usuário para minha tela principal

public void logar() {

    DAO<Usuarios> dao = new DAO<Usuarios>(Usuarios.class);
    List<Usuarios> users = dao.obterTodos();

    for (int i = 0; i < users.size(); i++) {

        if (txEmail.getText().equals(users.get(i).getEmail()) && txSenha.getText().equals(users.get(i).getSenha())) {
            idUsu = users.get(i).getId();//consigo guardar o id nessa varivel que criei
            Principal p = new Principal();
        
            i = users.size();
            fechar();
            try {
                p.start(new Stage());
                
                Alert alert = new Alert(AlertType.CONFIRMATION);alert.setTitle(idUsu.toString());
                alert.show();//fiz um teste de alerte pra ver se realmente pegava o id na variavel que criei
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

Se até o final da semana vc não conseguir resolver, Eu darei uma olhada melhor no seu post.

Então, eu modifiquei meu construtor da minha tela principal para receber um Long id que no caso é o tipo do meu id,e dps lá no construtor eu da tela principal eu fiz um variável para receber esse valor que ta vindo ta vindo na hora que login é feito e logo apos setei a variável para receber, porem esta dando nullpointerexception, não sei se o jeito correto para se fazer isso.

É bem tranquilo fazer isso em JavaFX.

1 curtida

poderia me dar uma luz, ou algum livro para poder clarear as ideias, sou iniciante, achei um livro na net Pro JavaFX™ Platform, dei uma olhada mas ele é bem antigo, acho que não consigo aplicar o que quero atras dele,

Como mencione acima somente no final da semana. Sinto muito por hora.

A ferramenta para passar dados para outras telas é o ResourceBundle.

Você precisa criar o ResourceBundle no mesmo método que usa para abrir a tela.

Segue um exemplo:

ESSE É O CÓDIGO QUE IRÁ ABRIR A NOVA JANELA
(você pode mudar o que marquei com *** pois são informações referentes ao seu projeto)

import java.io.IOException;
import java.util.Enumeration;
import java.util.ResourceBundle;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class AbrirTela 
{

    private void AbreJanela() 
    {
        //Variável com o ID do usuario
        Integer intcodUsuario = 100;   //***
        
        try
        {
            final Stage janela = new Stage();
            janela.setTitle ("Nova janela");  //***
            
            //Como alguns dados têm que ser passados para o formulário a ser aberto,
            //deve-se criar um ResourceBundle
            ResourceBundle rbJanela = new ResourceBundle(){
                @Override
                protected Object handleGetObject(String key)  //A string 'key' será captada no método INITIALIZE da janela que será aberta 
                {
                    if (key.contains("idUsuario"))  //*** Se sua nova janela procurar pela chave 'idUsuario' 
                    {
                        return String.valueOf(intcodUsuario);  //*** vai ter o retorno do texto, contido nesta variável
                    }                                          //OBS: o retorno deve ser sempre uma STRING
                    else if (key.contains("nomeUsuario"))
                    {
                        return "Francisco";
                    }
                    else      //Caso a janela não procure por nenhuma chave, retorna-se NULL
                    {
                        return null;
                    }
                }

                @Override
                public Enumeration<String> getKeys() {
                    throw new UnsupportedOperationException("Not supported yet."); 
                }
                
            
            };
            //Nesse ponto o ResourceBundle é passado para o formulário a ser aberto
            FXMLLoader carregador = new FXMLLoader(getClass().getResource("/Telas/TelasPrincipais/Principal.fxml"), rbJanela); //*** A string "/Telas/Telasprincipais/Principal.fxml" refere-se ao local do seu arquivo fxml (pacotes + arquivo fxml). Observe que existe uma BARRA "/" antes de todos os nomes: mantenha essa barra antes de todos os nomes.
            
            Parent parent = (Parent)carregador.load();

            //*** "JanelaController" é o nome do arquivo de controle da sua janela (mude, de acordo com o nome do arquivo de controle da sua nova janela) 
            JanelaController controleDaJanela = carregador.getController();

            Scene scene = new Scene(parent); 
            janela.setScene(scene);
            janela.show();
            
        }catch (IOException exc){
            exc.printStackTrace();
            System.out.println("EXCEÇÃO!");
        }catch (Exception exc){
            exc.printStackTrace();
            System.out.println("EXCEÇÃO!");
        }
    }

Para captar os dados, passados no código acima, você deverá captar os as chaves, através da variável “rb”, no método INITIALIZE do arquivo de controle da janela aberta.

SEGUE O CÓDIGO DO MÉTODO “INITIALIZE” PARA PEGAR OS DADOS NA NOVA JANELA:

    private String glbIdUsuario;  //***
    private String glbNomeUsuario; //***

    
    //Os dados passados na abertura da janela estarão na variável "rb", contida nos argumentos desse método
    @Override
    public void initialize(URL url, ResourceBundle rb) 
    {
        
        //Passando os dados para variáveis globais, que estarão disponíveis
        //para toda a classe
        this.glbIdUsuario = rb.getString("idUsuario");
        this.glbNomeUsuario = rb.getString("nomeUsuario");
        
    }

Qualquer dúvida, é só falar.

É necessário ter o cuidado de fazer a transformação do ID, de String para Integer, para que seu código funcione.

Mandei aqui a parte dos meu codigo do loginController

Olhando o que vc mandou acredito que consigo fazer mas agora não consigo achar as partes do meu código que devo alterar que possa funcionar o esquema de passar o id la pra tela Principal pq na hora que eu vou pegar o id tenho que aproveitar a conexão que faço para logar, sou bem iniciante nessa parte.

Na minha principalController eu Tenho um Label esperando pra pegar esse id do cliente que acabou de fazer o login

Vi que você está criando uma instância da janela “principal” e exibindo ela, caso o usuário seja validado.

Dessa forma, não vai funcionar.

Faça assim: dentro dessa mesma classe, crie um método à parte, com o código que enviei (o primeiro código - o que abre a janela).

Nesse método à parte, você vai pedir um argumento. Exemplo:

private void AbrirPrincipal (String codigoUsuario)
{

COLOQUE O MEU CÓDIGO AQUI (ALTERANDO AS PARTES QUE MARQUEI COM ***) e passando o argumento "codigoUsuario" para a key "idUsuario". Assim:

               if (key.contains("idUsuario"))  //*** Se sua nova janela procurar pela chave 'idUsuario' 
                {
                    return String.valueOf(codigoUsuario);  //*** vai ter o retorno do texto, contido nesta variável
                } 

}

Então, DENTRO DO SEU CÓDIGO, na linha 60, substitua o que você digitou (Principal p = new Principal()), pela chamada do novo método que você criou:

AbrirPrincipal(AQUI VAI O ID DO USUÁRIO QUE ESTÁ DENTRO DA LIST users);

Agora, aqui vai uma sugestão:

Vi que, para validar o usuário, você está jogando todos os usuários do banco de dados dentro de uma lista. Acho que fica bem mais complicado assim. Você pode comparar usuário e senha, diretamente a partir do banco de dados. Da forma que você fez, seu sistema vai sempre ter 2 trabalhos, desnecessariamente.

Sempre que o usuário logar, o sistema deveria ir até o banco de dados, procurar um usuário que possua o nome e a senha digitados e, se os dados estiverem corretos, abrir a janela.

O segundo código que enviei, deve ser colocado no método “initialize” do arquivo PrincipalController, para captar o ID que você enviou, quando abriu a janela.

Caso você não consiga, dessa vez, envie, aqui, o seguinte:

  • Os dois arquivos FXML;
  • Os dois arquivos CONTROLLER das duas janelas;
  • O arquivo DAO da tabela de usuários.

Amanhã, tentarei reescrever o código inteiro para você.

Porém é bom que você tente, hoje, com o que te enviei.

Você só vai entender, fazendo.

Cara olha o jeito que arrumei não sei se esta certo agora esta dando NullPointerException em algum lugar la no principalControlee, coloquei o id fora do método recebendo o id do banco, acho que key esteja colocando o nome errado talvez
e no final do método abriPrincipal eu instancio a tel principal, talvez isso esteja errado tb
private void abrirPrincipal(String codigoUsuario) {

	 try {
		 ResourceBundle rbJanela = new ResourceBundle() {

			@Override
			protected Object handleGetObject(String key) {
				if (key.contains("idUsuario"))  //*** Se sua nova janela procurar pela chave 'idUsuario' 
                {
                    return String.valueOf(id);  //*** vai ter o retorno do texto, contido nesta variável
                }else {
                	return null;//OBS: o retorno deve ser sempre uma STRING
                }
			}

			@Override
			public Enumeration<String> getKeys() {
				// TODO Auto-generated method stub
				return null;
			}
			 
		 };
		 
		 
	 }catch (Exception e) {
		// TODO: handle exception
	}
	 
	 try {
		p.start(new Stage());
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	 
 }

Assim não vai.

Manda teus códigos, como pedi, acima.

Tentarei reescrevê-los e te enviar da forma correta.

Consegui mandar eles assim, estou tentando de todas as formas mas não consigo T.T

DAO.java (1,5,KB) Login.fxml (813,Bytes) LoginController.java (1,9,KB) Principal.fxml (1,2,KB) PrincipalController.java (1,3,KB)

Estou colocando aqui meu projeto no git para quem poder me ajudar olhando melhor meu codigo

Ainda estou serias dificuldades ainda para conseguir, socoroo

qual a sua dificuldade???

Então eu tenho algumas telas, quando eu faço o login eu faço um pesquisa no banco de dados ele dai ele acessa pagina principal de tiver tudo certo, nesse momento antes de entrar eu queria mandar para tela principal o id e o nome da pessoa que logou, para que eu posso ter controle de quem esta usando o sistema naquele momento, então na minha cabeça eu preciso passar um dado que entra no loginController para a principalControler, ja tentei de varias formas mas nenhuma da certo

vc ja fez o que o colega acima recomendou?