JFrame - Senha de bancos com letras

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.

[code]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);  
}            

}

[/code]

[code]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  

}

[/code]

[code]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);        
}        

}

[/code]

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).

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?

[code]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); }    [/code]

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

Agradeço muito a ajuda.

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.