Aparecer o nome do Usuário ta tela após logar!

20 respostas
A

Boa noite galera, como eu faço para que, após o usuário logar no sistema, aparecer o nome dele no canto da tela???
Tipo assim.: ( Bem vindo Anderson )…

20 Respostas

A

Anderson S.:
Boa noite galera, como eu faço para que, após o usuário logar no sistema, aparecer o nome dele no canto da tela???
Tipo assim.: ( Bem vindo Anderson )…

T

pega o nome e passa por parametro =D

A

Não entendi o que vc quis dizer… eu tava pensando em fazer assim, quando o usuário logar, o nome dele aparecer no canto da tela, tipo em uma JLabel…

D

Vc provavelmente deve ter instanciado a classe do login pra fazer a validação, como provavelmente vc deve ter criado os setters e getters, pelo getter vc pega o nome da pessoa que fez o login.

D

Boa noite Anderson.

Tudo depende de que tela voce quer que o nome apareça, isto pois, voce dever ter criado um formulário de Login, então voce deve passar o nome do mesmo para o Frame Principal, isto é, presumindo que voce deve ter feito a sua aplicação desta forma.

Antes de mais nada, crie dois métodos estáticos, um para atribuir (set) e outro para recuperar (get), isto no Frame Principal, e lógico voce dever criar uma variável estática também no Frame Principal, é tudo mais ou menos assim:

public class FramePrincipal extends JFrame {

        private static String user_log;

        .....
    
         public static String getUser_log() {
             return user_log;
         }

         public static void setUser_log(String user_log) {
             FramePrincipal.user_log = user_log;
         }

         ....
}

No meu Frame de login, eu logo o usuário com o método booleano logon, assim:

private Boolean logon(){
        UsuarioBean bean = new UsuarioBean();
        bean.setLogin_usu(txtlogin.getText());
        bean.setSenha_usu(Formatter.getMD5(txtpassword.getText()));
        UsuarioDao dao = new UsuarioDao();
        try {
            dao.selectLogin(bean);
            if ("".equals(bean.getNome_usu())){
               verifyChances();
               return false;
            } else {
               FramePrincipal.setUser_log(bean.getLogin_usu());
               return true;
            }
        } catch (Exception ex) {
            ContentLayout.mensagemErro("recuperados", ex.getMessage());
            accessdenied = -1;
            return false;
        }
    }

Voce não precisa criar o método exatamente igual ao meu, apenas coloquei assim para que voce tenha uma idéia de como fazer.

Depois de logado, crie um JPanel onde voce posso colocar não só o usuário logado, mais também a data e a hora do sistema, assim:

SimpleDateFormat data = new SimpleDateFormat("dd/MM/yyyy");
        lbldata = new JLabel("Data: "+data.format(new Date()));
        lbldata.setHorizontalAlignment(JLabel.LEFT);
        
        data = new SimpleDateFormat("HH:mm");
        lblhora = new JLabel("Hora: "+data.format(new Date()));
        lblhora.setHorizontalAlignment(JLabel.CENTER);
 
        lbluser = new JLabel("Operador: "+FramePrincipal.getUser_log());
        lbluser.setHorizontalAlignment(JLabel.RIGHT);
    
        header = new JPanel(new GridLayout(1,3));
        header.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
        header.add(lbldata);
        header.add(lblhora);
        header.add(lbluser);
 
        add(header);
        ...

Agora depende de voce, se voce quer esta informção no cabeçalho ou no rodapé do Frame Principal

A

[quote=discorpio]Boa noite Anderson.

Tudo depende de que tela voce quer que o nome apareça, isto pois, voce dever ter criado um formulário de Login, então voce deve passar o nome do mesmo para o Frame Principal, isto é, presumindo que voce deve ter feito a sua aplicação desta forma.

Antes de mais nada, crie dois métodos estáticos, um para atribuir (set) e outro para recuperar (get), isto no Frame Principal, e lógico voce dever criar uma variável estática também no Frame Principal, é tudo mais ou menos assim:

public class FramePrincipal extends JFrame {

        private static String user_log;

        .....
    
         public static String getUser_log() {
             return user_log;
         }

         public static void setUser_log(String user_log) {
             FramePrincipal.user_log = user_log;
         }

         ....
}

No meu Frame de login, eu logo o usuário com o método booleano logon, assim:

private Boolean logon(){
        UsuarioBean bean = new UsuarioBean();
        bean.setLogin_usu(txtlogin.getText());
        bean.setSenha_usu(Formatter.getMD5(txtpassword.getText()));
        UsuarioDao dao = new UsuarioDao();
        try {
            dao.selectLogin(bean);
            if ("".equals(bean.getNome_usu())){
               verifyChances();
               return false;
            } else {
               FramePrincipal.setUser_log(bean.getLogin_usu());
               return true;
            }
        } catch (Exception ex) {
            ContentLayout.mensagemErro("recuperados", ex.getMessage());
            accessdenied = -1;
            return false;
        }
    }

Voce não precisa criar o método exatamente igual ao meu, apenas coloquei assim para que voce tenha uma idéia de como fazer.

Depois de logado, crie um JPanel onde voce posso colocar não só o usuário logado, mais também a data e a hora do sistema, assim:

SimpleDateFormat data = new SimpleDateFormat("dd/MM/yyyy");
        lbldata = new JLabel("Data: "+data.format(new Date()));
        lbldata.setHorizontalAlignment(JLabel.LEFT);
        
        data = new SimpleDateFormat("HH:mm");
        lblhora = new JLabel("Hora: "+data.format(new Date()));
        lblhora.setHorizontalAlignment(JLabel.CENTER);
 
        lbluser = new JLabel("Operador: "+FramePrincipal.getUser_log());
        lbluser.setHorizontalAlignment(JLabel.RIGHT);
    
        header = new JPanel(new GridLayout(1,3));
        header.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
        header.add(lbldata);
        header.add(lblhora);
        header.add(lbluser);
 
        add(header);
        ...

Fiz um parada aqui que aparentemente deu certo!, vou fazer mais testee qualquer coisa eu aviso!!

A

Vlw discorpio , deu certo aqui, não fiz igual o seu, mas entendi como faz...
Mas to com um outro problema aqui, no botao logar.... ele verifica se os usuarios são válidos, caso sim abre a Frame Principal, caso não, era pra lançar uma execção...Mas ta acontecendo o seguinte, caso o usuário não seja válido ele não lança a execção, será o por que desse erro??????? Vo postar o método do botão Logar..

BOTÃO LOGAR..
private void bt_logarActionPerformed(java.awt.event.ActionEvent evt) {                                         

          if(evt.getSource() == bt_logar){
              LoginNegocio log = new LoginNegocio();
           
             try {
                List<Login> lista = log.buscarLogins(tf_usuario.getText() , tf_senha.getText() );
                for(Login login : lista){
                    String usuario = login.getUsuario();
                    String senha = login.getSenha();

                    if((tf_usuario.getText().equals(usuario)) && (tf_senha.getText().equals(senha))){
                       ContatoFrame frame = new ContatoFrame();
                       frame.addLogin(usuario);
                       frame.setVisible(true);

                    }else{
                         JOptionPane.showMessageDialog(null,"Usuário ou Senha Inválidos"); // ESSA É A ESXCEÇÃO TERÍA QUETER SIDO LANÇADA 

                      }
                }

            } catch (SQLException ex) {
                Logger.getLogger(TelaLogin.class.getName()).log(Level.SEVERE, null, ex);
            }

          }
    }
D

Bom dia Anderson.

Já que voce está usando essa lógica, então o correto seria assim:

private void bt_logarActionPerformed(java.awt.event.ActionEvent evt) {                                           
  
          if(evt.getSource() == bt_logar){   
              LoginNegocio log = new LoginNegocio();   
             
             try {   
                List<Login> lista = log.buscarLogins(tf_usuario.getText() , tf_senha.getText() );
                ContatoFrame frame = new ContatoFrame();  // O frame de contato tem que estar fora do loop    
                for(Login login : lista){   
                    String usuario = login.getUsuario();   
                    String senha = login.getSenha();   
  
                    if((tf_usuario.getText().equals(usuario)) && (tf_senha.getText().equals(senha))){   
                       frame.addLogin(usuario);   
                       frame.setVisible(true);   
                       break; // Tão logo o usuário foi encontrado, não é necessário procurar o resto da lista, é ?
                    }  else {
                       frame.addLogin("");
                    }
                }
                if ("".equals(frame.getLogin()){ 
                   JOptionPane.showMessageDialog(null,"Usuário ou Senha Inválidos");  
                }
            } catch (SQLException ex) {   
                Logger.getLogger(TelaLogin.class.getName()).log(Level.SEVERE, null, ex);   
            }   
  
          }   
    }

Repare que voce estava pecando em tres aspectos:

1º) O Frame contato tem que ficar fora do loop, porque se ficar dentro, voce vai criar várias instâncias do frame, tantas quanto for o tamanho do laço do loop.

2º) Tão logo o usuário seja logado, a procura da lista tem que parar, porque se continuar, o próximo usuário que não é logado vai passar pelo teste do IF novamente é o resultado será false, e quando o último usuário da lista passar, o resultado será o usuário que não deverá estar logado.

3º) Na verdade, o aviso de usuário não logado era para ser disparado a cada linha percorrida da lista, entretanto como o Frame contato estava sendo instanciado novamente a cada percurso do loop, talvez seja essa o porque não ter disparado. Repare que eu coloquei a mensagem fora do loop, verficando se o login do frame está nulo.

A meu ver, esta lógica de autenticação do usuário não é a correta, ou seja, voce está varrendo sequencialmente toda uma lista de usuários. A lógica de varredura sequencial há muito tempo foi abolida, visto que ela sobrecarrega em muito o processamento de sua aplicação, comprometendo a performance da mesma. Imagine se voce fosse sócio do Bill Gates ou do Steve Jobs e Steve Wozniek (donos da Apple), cujos funcionários tem pra lá de 1000 (mil) e todos eles precisem se conectar ao sistema :!: :!: :!:

O correto seria voce criar uma classe DAO que executasse todas as linhas de comando SQL e dentro desse DAO, escrevesse uma linha de comando SQL que retornasse apenas o usuário autenticado, em caso do ResultSet retornar uma linha de registro, então o usuário está logado, em caso negativo não.

Veja no meu método booleano logon(), eu uso o DAO passando para o mesmo um bean populado com os usuarios que eu quero verificar, ele é verificado na próxima linha se estar nulo ou não.

Espero ter ajudado

A

Não deu certo, a execção não foi lançada!! :frowning:

D

Boa tarde Anderson.

Não deu certo talvez por causo disto aqui:

if ("".equals(frame.getLogin()){   
       JOptionPane.showMessageDialog(null,"Usuário ou Senha Inválidos");     
}

Voce, ao menos, criou um método getLogin, que retorna o usuário logado :?: :?: :?:

Outra coisa, faltou a mensagem de usuário logado, se ele não está mostrando a mensagem, é porque está encontrando o registro, então coloque uma mensagem de registro encontrado, assim:

try {     
                List<Login> lista = log.buscarLogins(tf_usuario.getText() , tf_senha.getText() );   
                ContatoFrame frame = new ContatoFrame();  // O frame de contato tem que estar fora do loop       
                for(Login login : lista){     
                    String usuario = login.getUsuario();     
                    String senha = login.getSenha();     
     
                    if((tf_usuario.getText().equals(usuario)) && (tf_senha.getText().equals(senha))){     
                       frame.addLogin(usuario);     
                       frame.setVisible(true);
                       JOptionPane.showMessageDialog(null,"Usuário encontrado");  
                       break; 
                    }  else {   
                       frame.addLogin("");   
                    }   
                }   
                if ("".equals(frame.getLogin()){   
                   JOptionPane.showMessageDialog(null,"Usuário ou Senha Inválidos");     
                }   
            } catch (SQLException ex) {     
                Logger.getLogger(TelaLogin.class.getName()).log(Level.SEVERE, null, ex);     
            }
A
discorpio:
Boa tarde Anderson.
Anderson S.:
Não deu certo, a execção não foi lançada!! :(

Não deu certo talvez por causo disto aqui:

if ("".equals(frame.getLogin()){   
       JOptionPane.showMessageDialog(null,"Usuário ou Senha Inválidos");     
}

Voce, ao menos, criou um método getLogin, que retorna o usuário logado :?: :?: :?:

Outra coisa, faltou a mensagem de usuário logado, se ele não está mostrando a mensagem, é porque está encontrando o registro, então coloque uma mensagem de registro encontrado, assim:

try {     
                List<Login> lista = log.buscarLogins(tf_usuario.getText() , tf_senha.getText() );   
                ContatoFrame frame = new ContatoFrame();  // O frame de contato tem que estar fora do loop       
                for(Login login : lista){     
                    String usuario = login.getUsuario();     
                    String senha = login.getSenha();     
     
                    if((tf_usuario.getText().equals(usuario)) && (tf_senha.getText().equals(senha))){     
                       frame.addLogin(usuario);     
                       frame.setVisible(true);
                       JOptionPane.showMessageDialog(null,"Usuário encontrado");  
                       break; 
                    }  else {   
                       frame.addLogin("");   
                    }   
                }   
                if ("".equals(frame.getLogin()){   
                   JOptionPane.showMessageDialog(null,"Usuário ou Senha Inválidos");     
                }   
            } catch (SQLException ex) {     
                Logger.getLogger(TelaLogin.class.getName()).log(Level.SEVERE, null, ex);     
            }

Pois é, eu criei o getLogin(), senão tinha acusado que o método não existe, e essa mensagem de usuário logado não prscisa aparecer, basta apenas direcionar para a Frame principal,.. continua não lançando a excção!

D

Olá Anderson.

Me responda uma coisa.

Como essa lista abaixo está sendo populada.

List<Login> lista = log.buscarLogins(tf_usuario.getText() , tf_senha.getText() );

Pelo que me consta, voce já passa como parâmetro, o que voce digitou dentro dos JTextFields, o que não entendi então o porque do loop de varredura da lista :?: :?: :?:

A
Pois é, com esse método, eu vo no banco de dados e busco o usuario e senha referentes a esse parametro, e jogo os dois dados dentro de uma lista, faço esse loop para adicionar o usuario e senha buscados dentro dessas duas variáveis que criei ai.... a única maneira que vi para setar o usuario e senha da lista em variáveis foi assim!!! vo postar o método que busca no Banco de dados!!! Obrigado!!
public List<Login> buscarLogin(String usuario , String senha) throws SQLException{

       Connection conn = Conexao.getConexao();
       String sql = "select * from login where usuario = ? and senha = ?";
       PreparedStatement stmt = conn.prepareStatement(sql);
       stmt.setString(1,usuario);
       stmt.setString(2,senha);
       ResultSet rs = stmt.executeQuery();

       List<Login> lista = new ArrayList<Login>();

       while(rs.next()){

           Login log = new Login(rs.getString("usuario"),rs.getString("senha"));
           lista.add(log);
       }
       rs.close();
       stmt.close();
       return lista;

    }

}
A

Ai discorpio, esse é meu método…

D

Bom dia Anderson.

Se voce é pai, então meus parabéns pelo dia de hoje.

Hoje eu dei meus parabéns ao meu pai, o único que sobrou na face da Terra e também dos céus e todo o universo, DEUS.

Voltando ao assunto do seu método, acho que voce está cometendo redundância de métodos, ou seja, o método “buscarLogins” faz exatamente a mesma coisa que o método que dispara o evento do botão, enquanto o método “buscarLogins” autentica o usuário existente no banco e armazena numa lista, o outro método percorre toda a lista para encontrar o usuário que foi encontrado anteriormente. Voce não acha isto disperdício de recursos :?: Isto é o que chamamos aqui onde trabalho de congestionamento de lógica. Outra questão que voce não considerou é que e se o usuário não existir no banco de dados, então logo no método “buscarLogins” terá opção negativa, e a lista não será preenchida, assim sendo, a varredura da lista no segundo método torna-se ineficaz.

Eu acho que entendi o que voce pretende fazer, ou seja, voce criou esta lista porque quer fazer um controle dos usuários que estão logados, não é isto mesmo :?: Nada impede de voce fazer isto, porém vamos fazê-lo de maneira correta.

Em primeiro lugar, voce deverá tornar público o acesso a sua lista de usuários, veja bem, eu disse o acesso a lista que deverá ser público e não a lista propriamente dita. O que eu quero dizer é que vamos encapsular esta lista no Frame Princiapal, ah, esta lista também tem que ser estática juntamente com os seus métodos, assim:

.....
private static List<Login> lista;
....
....
public static List<Login> getLista(){
    if (lista == null) lista = new ArrayList<Login>();
    return lista;
}

public static void setLista(List<Login> lista){
    this.lista = lista;
}
....
....

Vamos tornar o método “buscarLogins” com retôrno booleano, fazendo com que se o usuário for encontrado, retorne true, caso contrário, retorne false, assim:

public Boolean buscarLogin(String usuario , String senha) throws SQLException{   
       Boolean ret = false;
       Connection conn = Conexao.getConexao();   
       String sql = "select * from login where usuario = ? and senha = ?";   
       PreparedStatement stmt = conn.prepareStatement(sql);   
       stmt.setString(1,usuario);   
       stmt.setString(2,senha);   
       ResultSet rs = stmt.executeQuery();
   
       /* Se o ResultSet retornar com tamanho igual a zero,
           significa que o usuário não foi encontrado */
       if (rs.size() = 0){
           JOptionPane.showMessageDialog(null,"Usuário ou Senha Inválidos");       
       } else {
           while(rs.next()){   
                Login log = new Login(rs.getString("usuario"),rs.getString("senha"));   
                FramePrincipal.getLista().add(log);
           }
           ret = true;   
       }   
       rs.close();   
       stmt.close();   
       return ret;
    }   
  
}

Agora vamos ao evento de disparo do botão

private void bt_logarActionPerformed(java.awt.event.ActionEvent evt) {                                           
  
          if(evt.getSource() == bt_logar){
              LoginNegocio log = new LoginNegocio();        
              if (log.buscarLogins(tf_usuario.getText() , tf_senha.getText()){
                   // Dar acesso ao usuário.
              } else {
                   // Negar acesso ao usuário
              }
              ...
          }
}

Repare como ficou bem dinamizado o seu método “buscarLogins”, onde o que voce chama de disparar exceção que na verdade é disparar apenas uma mensagem de alerta ao usuário, e feita dentro do método “buscarLogins”, onde, no primeiro momento é realizada a autenticação do usuário, tendo ao mesmo tempo o preenchimento da lista única que está encapsulada.

O que voce estava fazendo era o mesmo erro anterior, ou seja, a cada chamada do método “buscarLogins” estava criando uma lista nova com apenas um único elemento.

Espero ter te ajudado

A

Bom dia discorpion, feliz dia dos pais pra você mas eu não sou pai… :XD:
É o seguinte, esse método que vc criou ai pra atenticar o login, ta quebrando toda minha regra, na minha aplicação eu tenho 2 pacotes, o das telas e o pacote Banco, que contem as Classes DAO… nesse seu método vc ta chamando a frame principál dentro do método buscarLogins que esta dentro da classe DAO , acho que isso não é viável para o meu padrão de desenvolvimento!! :frowning:

A

D

Olá anderson,

Esta questão é muito simples de resolver. Encapsule a lista dentro do sua classe DAO, assim voce não precisa chamá-la do FramePrincipal, eu citei o FramePrincipal, porque não conheço toda as regras de sua aplicação e nada impede da lista ser encapsulada no DAO.

O que não pode ocorrer, e voce ficar instanciando uma nova lista a cada percurso da chamada do método buscar Logins, porque senão, voce vai ter varias listas instânciadas com um único ou sem nenhum elemento e isso é que vai quebrar a lógica de desenvolvimento da sua aplicação.

A
eu fiz de uma outra maneira aqui e deu certo, olha o que vc acha.... o método DAO fico assim.. 
public boolean buscarLogin(String usuario , String senha) throws SQLException{

       boolean ret = false;
       Connection conn = Conexao.getConexao();
       String sql = "select * from login where usuario = ? and senha = ?";
       PreparedStatement stmt = conn.prepareStatement(sql);
       stmt.setString(1,usuario);
       stmt.setString(2,senha);
       ResultSet rs = stmt.executeQuery();

       while(rs.next()){

           Login log = new Login(rs.getString("usuario"),rs.getString("senha"));
           ret = true;
       }
       rs.close();
       stmt.close();
       return ret;

    }
O botão fico assim,
private void bt_logarActionPerformed(java.awt.event.ActionEvent evt) {                                         

        if(evt.getSource() == bt_logar){
            loginDAO dao = new loginDAO();
            ContatoFrame frame = null;
            try {
                frame = new ContatoFrame();
            } catch (SQLException ex) {
                Logger.getLogger(TelaLogin.class.getName()).log(Level.SEVERE, null, ex);
            }
            String usuario = tf_usuario.getText();
            String senha = tf_senha.getText();
            try {
                if (dao.buscarLogin(usuario,senha)) {
                    frame.addLogin(usuario);
                    frame.setVisible(true);
                       
                }else{
                    JOptionPane.showMessageDialog(null,"Usuário ou Senha inválidos");
                }
            } catch (SQLException ex) {
                Logger.getLogger(TelaLogin.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
APARENTEMENTE DEU CERTO,QUANDO O USUÁRIO É VÁLIDO, ELE LOGA, CASO NÃO ELE LANÇA A EXCÇÃO, OBRIGADO, QUALQUER COISA EU AVISO!!! :mrgreen:
D

Olá Anderson.

Agora sim, voce simplificou a lógica.

Se a função principal da lista era outra, que não seja a de armazenar usuários logados e manter controles dos mesmos, então esta foi sabiamente eliminada.

Fico feliz de ter te ajudado.

Criado 5 de agosto de 2010
Ultima resposta 8 de ago. de 2010
Respostas 20
Participantes 4