JFrame - Senha de bancos com letras

3 respostas
analins

Olá comunidade,

Tento nesses códigos, simular as tela de senha de bancos financeiros (os Buttons exibem letras da senha )
Ao prescionar um Button, ele pega uma letra na primeira tela, outra letra na segunda tela e outra na terceira.
A primeira tela ao ler o digito prescionado por um button deve ser chamada automaticamente a segunda tela, o mesmo p/ 2a com a 3a.

O código está escrito em forma elementar. Faço alguns comentários, mostro alguns erros (como o da comparação com equals - String, char).
Mostrem-me o que estou fazendo errado. Façam sugestão de modificações.

Agradeço muito a ajuda.

public class SenhaS1 extends javax.swing.JFrame {// 1a tela  
  
  
    public SenhaS1() {  
        initComponents();  
    }  
  
  
public JPasswordField getPass1() {   
      return jPasswordField1;  
   }  
      
    private void initComponents() {  
  
    private void button8ActionPerformed(java.awt.event.ActionEvent evt) {                                          
         valorB("a");    
    }                                         
    private void button7ActionPerformed(java.awt.event.ActionEvent evt) {                                          
         valorB("d");    
  
    }                                         
//o mesmo para os outros buttons   [...]  
                                
  
//o objetivo aqui é: ao ser pressionado um button (ele deve ser lido e a próxima tela deve ser chamada   
//para ler o outro valor.       Esse mesmo método repito nas outras 2 classes  
  
  
    private void jPasswordField1ActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        char[] seq1 = jPasswordField1.getPassword();  
           if (seq1!=null) {     // ver se caracter dif de nulo, caso verdadeiro chama a 2a tela, funciona???  
  
               SenhaS2 ss2 = new SenhaS2();  
               ss2.setDefaultCloseOperation(javax.swing.JFrame.HIDE_ON_CLOSE);  
               ss2.setVisible(true);  
               setVisible(false); }  
  
                                 }                                                 
  
    public static void main(String args[]) {  
        java.awt.EventQueue.invokeLater(new Runnable() {  
            public void run() {  
                new SenhaSequencia1().setVisible(true);  
            }  
        });  
    }  
  
    private javax.swing.JPasswordField jPasswordField1;  
  
  
   private void valorB(String letra1){ //atribui valor ao button  
  
      jPasswordField1.setText(valor);  
    }            
}
public class SenhaS2 extends javax.swing.JFrame { //2a tela  
  
  
    public SenhaS2() {  
        initComponents();  
    }  
  
  
public JPasswordField getPass2() {    
      return jPasswordField2;  
   }  
  
private void button1ActionPerformed(java.awt.event.ActionEvent evt) {                                          
       valorBotao("b");   
}     //    [...]  
  
  
private void valorBotao(String letra2){  
     
     SenhaS1 ss1 = new SenhaS1();  
     char[]letra1 = ss1.getPass1().getPassword(); //pega o valor digitado em SenhaS1  
     jPasswordField2.setText(new String (letra1)+ letra2); //adiciona as 2 letras e imprime na tela, correto???  
    }    //ou seja é lido 1 digito do button, mas impresso 3 no JPawordField  
}                 




view plaincopy to clipboardprint?
public class SenhaS3 extends javax.swing.JFrame {//3a tela  
  
  
    public SenhaS3() {  
        initComponents();  
    }  
  
  
public JPasswordField getPass3() {    
      return jPasswordField3;  
   }  
  
private void button1ActionPerformed(java.awt.event.ActionEvent evt) {                                          
       valorBotao("c");   
}     //    [...]  
  
  
private void valorBotao(String letra3){  
     
    SenhaS1 ss1 = new SenhaS1();  
    char[]letra1 = ss1.getPass1().getPassword(); //pega o valor digitado em SenhaS1  
    jPasswordField2.setText(new String (letras)+ letra3); //adiciona as 2 letras e imprime na tela, correto???  
    }   //ou seja é lido 1 digito do button, mas impresso 3 no JPawordField  
}
public class TelaConf extends javax.swing.JFrame {//Comparo a senha        
        
    public TelaConf() {        
        initComponents();        
    }        
          
    SenhaC s3 = new SenhaC();       
       
  // char[] sen = s3.getPass3().getPassword();         
     
    String sen = s3.getPass3().getPassword();//dá erro    
    String real = "abc";        
        
        
      if(sen.equals(real)){ //o erro acontece aqui, quando uso ==, dá erro também      
      
//tentei com String sen = new String(s3.getPass3().getPassword());   // Continua dando erro.         
            }    
    {        
       MensagemP p = new MensagemP();        
       p.setDefaultCloseOperation(javax.swing.JFrame.HIDE_ON_CLOSE);        
       p.setVisible(true);        
       setVisible(false);        
        
}     else            
        
    { MensagemS s = new MensagemS();        
      s.setDefaultCloseOperation(javax.swing.JFrame.HIDE_ON_CLOSE);        
      s.setVisible(true);        
      setVisible(false);        
    }        
        
}

3 Respostas

E

Ana, o problema aí é que quando você instância um novo Senha 1 , ele não tem nada a ver com o senha 1 que você instanciou no começo do programa, ou seja, ele não tem a senha guardada. Para recuperar o valor real da senha você precisa guardar a instância daquele primeiro objeto. Um jeito é passar o senha 1 como parâmetro no construtor de senha 2. Outro jeito( que eu recomendo) é usar o Singleton Pattern. Dá uma pesquisada que vai entender.

Sem querer me meter muito também, devo dizer que já posso prever outros problemas nesse código posterior mente. Um exemplo é se a senha do cara for “ad”. O cara aperta o a e o botão onde estava d vira e. Se eu fosse você, tratava cada botão separadamente e deixava tudo num único jframe. Seria maid difícil, mas faria mais sentido. Lembre-se que 7 e 9 tem quatro letras(até onde eu me lembrava).

analins

elissonandrade,

Eu sou iniciante tenho 10 meses em java. Nesse projeto devo simular essa interface para estudar a usabilidade. É algo simples.
Como faço para pegar uma letra em cada tela? E comparar as 3 letras em outra classe? (por ex: Class1, Class2,Class3, ClassConf)

Devo tratar os Buttons individualmente, desse jeito ?
private void button9ActionPerformed(java.awt.event.ActionEvent evt) {                                        
  String val="b";   jPasswordField1.setText(val); }
Devo criar um evento para chamar a tela 2 ??? Está correto o abaixo?
private void jPasswordField1ActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        char[] seq1 = jPasswordField1.getPassword();    
           if (seq1!=null) {     // ver se caracter dif de nulo, caso verdadeiro chama a 2a tela, funciona???    
    
               SenhaS2 ss2 = new SenhaS2();    
               ss2.setDefaultCloseOperation(javax.swing.JFrame.HIDE_ON_CLOSE);    
               ss2.setVisible(true);    
               setVisible(false); }

Como devo armazenar a senha do objeto de cada classe? E chamá-las na classe ClassConf ?

Agradeço muito a ajuda.

E

Tá, já que você é iniciante, a primeira coisa que você vai fazer é usar os imports, pois é muito difícil trabalhar com o nome completo da classe sem ficar confuso. Dá uma pesquisada que você logo encontra.

A verdade é que eu não consigo nem explicar como se fosse uma coisa fácil, pois não é. Então deixa ver se eu entendi direito: Você que criar um teclado numérico na tela, mas que tenham as letrinhas nas teclas, e que conforme o cara for clicando nas teclas ele digite um texto no campo de senhas, que nem fazemos no celular, é isso? Pois se for, tá pegando então.

Agora, se for aquelas telas em que cada vez que você aperta um botão, a letra muda, então é muito mais simples de se fazer. Esqueça o que eu disse no meu post anterior. O que você precisa então é altera o construtor de senhas2 e senhas3 para que o seguinte código faça sentido:

char[] seq1 = jPasswordField1.getPassword();      
            if (seq1!=null) {     // ver se caracter dif de nulo, caso verdadeiro chama a 2a tela, funciona???      
       
                SenhaS2 ss2 = new SenhaS2(seq1);

Ou seja, assim o objeto que você criou vai ter acesso a senha digitada antes, sacou? Entenda, o campo de senhas que você instância na classe 1 é totalmente não relacionado com o que você cria na classe dois. Se você não der um jeito de mandar a senha digitada na classe1 para a classe2 , a primeira letra que o usuário digitou provavelmente nunca será recuperada, entendeu? Essa é uma das base de OO, todo e qualquer objeto instanciado se torna único e totalmente independente dos outros, a menos que você passe a referência de outros objetos para ele.

Infelizmente não conheço nenhum bom artigo sobre o assunto pra lhe indicar. O que eu recomendo que você faça uma pesquisa sobre campos estáticos, atributos de um objeto, passagem de parâmetros por referência e escopo de variáveis. É muita coisa, mas garanto que você vai precisar.

Criado 22 de setembro de 2011
Ultima resposta 25 de set. de 2011
Respostas 3
Participantes 2