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?
tentei sim porem acredito que fiz da maneira errada pq não roda, to desde sexta tentando fazer da maneira que ele disse so que nao consigo colocar no meu codigo
Vamos la’ então, em programação existem muitas formas de fazer a mesma coisa.
Essa que vou te passar funciona da seguinte forma :
A referencia da aplicação principal e’ passada para o(s) Controller(s) e a chamada do Logjn parte da aplicação principal e não o contrario.
Dentro do Controller(s) e’ criado um metodo, no caso foi escolhido o nome
.setApplication(AppMain) e todos os detalhes inclusive conexao com o BD são colocados dentro dele e não no
public void initialize(URL url, ResourceBundle rb) {}
Não sei se está usando o NetBeans, mas se não tiver é somente pegar os fontes e adapta-lo na IDE de seu gosto e testar.
fx.zip (133,6,KB)
Bons Codigos
Renald,
Seguem suas classes reescritas.
Só alterei as classes LoginController.java E PrincipalController.java.
Salve suas duas classes atuais, em algum outro local e substitua pelas classes que eu alterei.
Deve funcionar.
Percebi que você ainda está MUITO cru, com relação a certos assuntos que você já deveria dominar. Dessa forma, recomendo que você procure tópicos no google, ou mesmo aqui, no fórum, que falem sobre como abrir janelas. Pesquise também: “JavaFX como fazer ResouceBundle”.
Dê uma vasculhada na documentação do JavaFX: https://openjfx.io/ . Na busca, digite ResourceBundle e veja como tudo funciona. É em inglês, mas o chrome tem o tradutor.
A forma que você utiliza é simples e eficaz (instanciar o fxml e depois dar um ‘show’), porém você ainda não tem ideia de como é o código completo que faz isso acontecer.
O código que enviei é o código completo de como abrir uma janela e enviar informações de uma janela para a outra.
Te entreguei tudo de bandeja. Caso você não consiga fazer funcionar, aí só pesquisando, mesmo.
Abraço!
LoginController.java (4,8,KB) PrincipalController.java (3,4,KB)
Muito obrigado pela ajuda Alexandre, vou passar meu código para de acordo com o seu, eu tinha feito um jeito para fazer funcionar mas acho que foi Gambiara, na hora do login eu fiz uma variável static pegando o meu longID, dai la na minha principal eu fazia minha variável que era um label receber essa variável static do LoginController funcionou a priori, mas vou deixar o meu de acordo com o seu, De coração muito obrigaado a todos que me ajudaram 1!!!
Na realidade, a solução que você achou, não é errada (tanto que funcionou).
Porém, no momento em que você fechou a janela de login, a variável foi destruída, junto com a janela. Se você não precisa mais da variável, não há problema em destruí-la.
Porém, se quiser manter a variável com o ID do usuário sempre ativa, para todas as janelas que forem abertas, considere não fechar(destruir) a janela de login. Simplesmente, esconda ela. Dessa forma, a variável estática, que foi criada, estará sempre disponível.
De toda forma, estude sobre ResourceBundle e sobre os tipos de janelas (modal, etc). Você ainda vai se deparar com diversas situações, onde precisará usar tudo isso.
Abraço.