Variável retornando Null?

Boa tarde galera.

Eu pretendo colocar uma label de “Bom dia, usuário” na página principal do programa logo após o login, sendo que nome viria do field referente ao login.

O problema é que não consigo fazer funcionar… Todas as formas que tentei a variável vai para a ViewHome como null… Como posso consertar?

Como estou iniciando no Java (e na programação em si), tenho apanhado bastante

VIEWLOGIN

public class ViewLogin extends javax.swing.JFrame {

public String login;

public ViewLogin() {
    initComponents();
    setIcon();
    colorOverlay.setBackground(new Color(51, 51, 51, 155));
}


private void btnLoginMousePressed(java.awt.event.MouseEvent evt) {                                      
    UserDAO dao = new UserDAO();
   
   if(dao.checkLogin(usrField.getText(), passField.getText())){
       new ViewHome().setVisible(true);
       
       login = usrField.getText();
       
       this.dispose();
       
   }else{
       new ViewLoginError().setVisible(true);
   }
}    

VIEWHOME

public class ViewHome extends javax.swing.JFrame {

ViewLogin user = new ViewLogin();//Tentativa desesperada de DEBUG

public ViewHome() {
    initComponents();
    setIcon();
    time();
    System.out.println(user.login); //Tentativa desesperada de DEBUG
    colorOverlay.setBackground(new Color(51, 51, 51, 155));
}


private void time(){
    //LocalTime now = LocalTime.parse("18:00:00"); //debug
    LocalTime now = LocalTime.now(Clock.systemDefaultZone());
            
    int hora = now.getHour();
    
    if(hora < 12){
        lblTime.setText("Bom dia, " + user.login);
    } else if (hora < 18) {
        lblTime.setText("Boa tarde, " + user.login);
    } else{
        lblTime.setText("Boa noite, " + user.login);
    }
}

Peço desculpas pela pergunta provavelmente estupida, mas não vi outra alternativa…
Agradeço desde já!

Bom amigo vamos lá, primeiramente este: [quote=“Wilian_Silva, post:1, topic:350574”]
ViewLogin user = new ViewLogin();
[/quote]

Este user, é outro Objeto, ele não se refere a tela de login aberta, por este motivo a variável dele, é null, ou seja, neste caso ai vc está instanciando outro objeto, ex:
João e Paulo são da Classe Pessoa
João está com chave da casa para vc abrir
mas vc ta pedindo para o Paulo a chave, sendo que a Chave está com João.

O que vc pode fazer:

Já que quem chama da Tela ViewHome é a Classe ViewLogin, vc pode passar pelo construtor o nome do usuário. Exemplo:
Na Classe ViewHome vc faria:

public class ViewHome extends javax.swing.JFrame {
   //recebemos o nome do usuario pelo construtor
   public ViewHome(String nomeDoUser) {
        initComponents();
        setIcon();
        time();
        //veja q recebemos o nome do usuario pelo parametro
        System.out.println(nomeDoUser); //Tentativa desesperada de DEBUG
        colorOverlay.setBackground(new Color(51, 51, 51, 155));
    }

    
    
    private void time() {
        //LocalTime now = LocalTime.parse("18:00:00"); //debug
        LocalTime now = LocalTime.now(Clock.systemDefaultZone());

        int hora = now.getHour();

        if (hora < 12) {
            lblTime.setText("Bom dia, " + user.login);
        } else if (hora < 18) {
            lblTime.setText("Boa tarde, " + user.login);
        } else {
            lblTime.setText("Boa noite, " + user.login);
        }
    }
}

e lá no ViewLogin quando vc for chamar a tela vc passaria por parâmetro no construtor:

if(dao.checkLogin(usrField.getText(), passField.getText())){
       //veja que passamos no construtor agora.
       new ViewHome(usrField.getText()).setVisible(true);       
       
       this.dispose();
       
   }else{
       new ViewLoginError().setVisible(true);
   }
1 curtida

@Jeanderson_Silva, muitíssimo obrigado pela resposta e pela solução. Tenha um ótimo dia e mais uma vez, obrigado!

1 curtida

Obrigado, desejo o mesmo para vc, e bons estudos

1 curtida

Me surgiu outra dúvida (provavelmente idiota)… mas como posso chamar o “nomeDoUser” no lugar do “user.login” no time()?

Bom no caso vc tem q salvar este dado na sua classe ViewHome, poderia ser assim:

public class ViewHome extends javax.swing.JFrame {
    //variavel q vai receber o valor que é passado no construtor
    String nomeDoUser;
   //recebemos o nome do usuario pelo construtor
   public ViewHome(String nomeDoUser) {
        initComponents();
        setIcon();
        time();
        //veja q recebemos o nome do usuario pelo parametro
        System.out.println(nomeDoUser);
     //aqui passamos para a váriavel nomeDoUser o dados que é passado por parâmetro
       this.nomeDoUser = nomeDoUser; //obs o this, significa que estou me referindo a variavel que está nesta classe.
        colorOverlay.setBackground(new Color(51, 51, 51, 155));
    }

ai no time é só usar a variavel que está com o dado salvo:

private void time() {
        //LocalTime now = LocalTime.parse("18:00:00"); //debug
        LocalTime now = LocalTime.now(Clock.systemDefaultZone());

        int hora = now.getHour();

        if (hora < 12) {
            lblTime.setText("Bom dia, " + this.nomeDoUser);
        } else if (hora < 18) {
            lblTime.setText("Boa tarde, " + this.nomeDoUser);
        } else {
            lblTime.setText("Boa noite, " + this.nomeDoUser);
        }
    }
1 curtida

Aprendi MUITO contigo. Obrigado :grin:

1 curtida

De nada :slight_smile: