Teclado Virtual [RESOLVIDO]

9 respostas
pedroroxd

Pessoal.. Estou fazendo uma aplicação em que o usuário utiliza teclado virtual para digitar sua senha...
Não é por questão de segurança não.. É porque ele não vai se dispor de um teclado.
Existe o campo do usuário (jTextField1) e o da senha (jPasswordField1).

Colokei 1 botão escrito "A", e coloquei isso nele:
if (jTextField1.hasFocus()) {
            String m = jTextField1.getText();
            jTextField1.setText(m + "A");
            jTextField1.requestFocus(true);
        }

        else {
            String m = jPasswordField1.getText();
            jPasswordField1.setText(m + "A");
            jPasswordField1.requestFocus(true);
        }
Problema: Não funciona... O focus pode estar no jTextField1, mas ele não entra na condição do hasFocus. Como que eu valido se ele está com o focus ou não? Já tentei com hasfocus e com o isfocusowner, mas nenhum da certo.

9 Respostas

lina

Oi,

Esse código esta dentro de um KeyEvent ?

Tchauzin!

kinow

Yo pedroroxd,

faz muito tempo que não mexo com Swing… mas a dúvida da lina já deve te ajudar… porque pelo que me lembro trabalhar com focus em Swing dá um pouco de trabalho, e é bom saber em que trecho de código você está verificando isso.

Fiz um frame aqui rapidamente, que tem um field pro user name, e outro pro password… e um botão.

O botão verifica qual componente tem o focus. O detalhe é o seguinte. Quando você clica no botão… O BOTÃO TEM O FOCUS :-o hahahaha, te juro. Quando você clica nele, ele tem o focus. Portanto, o que eu queria era saber “o último ‘focado’”… ou o último componente que teve o focus… como é um cenário um pouco mais específico, criei um FocusListener que me diz quem foi o último focado.

Desculpa se o código está feio, eventuais erros e a ficar usando a palavra focado… parece até que foi transformado em foca.

Abraço!

pedroroxd

lina:
Oi,

Esse código esta dentro de um KeyEvent ?

Tchauzin!


Não… Está dentro do click de um botão… (No caso a letra A)

Kinow… Eu não consegui entender seu código não…
É pq sou novo em java, e estou acostumado com frame, além de ele estar todo em ingles… ;X

lina

Oi,

Então… você já parou para pensar que quando o botão é clicado seu foco não está mais no JTextField ?

Tchauzin!

pedroroxd

sim…
só que nao pensei na soução rs

lina

Oi,

Você poderá utilizar "flags" para identificar em qual componente você tem foco.

Por exemplo:

1-> Inicie a sua tela com o foco no campo de texto
2-> Crie um FocusListener para ele e assim que ele ganhar o foco define sua flag true;
3-> Quando você clicar no botão você apenas inverte o valor da flag.

boolean ib_flag_textfield = false, ib_flag_password = false;

textfield.addFocusListener(new FocusAdapter() {
                        
     public void focusGained(FocusEvent ao_evento) {
          ib_flag_textfield = true;	
          ib_flag_password = false;                
     }
});

passwordfield.addFocusListener(new FocusAdapter() {
                        
     public void focusGained(FocusEvent ao_evento) {
          ib_flag_textfield = false;	
          ib_flag_password = true;                
     }
});

Na ação do botão você faz:

if (ib_flag_textfield) {
     String m = jTextField1.getText();   
     jTextField1.setText(m + "A");
}
else if (ib_flag_password) {
{
     String m = jPasswordField1.getText();   
     jPasswordField1.setText(m + "A");  
}

// Volta o estado das flags para o inicial.
ib_flag_textfield = false;	
ib_flag_password = false;

Pronto. Isso é uma logica que deverá ser melhorada! e nem sempre é uma solução agradavel e boa.

Tchauzin!

pedroroxd

Oi,

Nesse código, ele pede para passar o ib_flag para final:
boolean ib_flag_textfield = false, ib_flag_password = false;     
  jTextField1.addFocusListener(new FocusAdapter() {  
                            
       public void focusGained(FocusEvent ao_evento) {  
            ib_flag_textfield = true;   
            ib_flag_password = false;                  
       }  
  });  
    
  jPasswordField1.addFocusListener(new FocusAdapter() {  
                            
       public void focusGained(FocusEvent ao_evento) {  
            ib_flag_textfield = false;      
            ib_flag_password = true;                  
       }  
  });
Mas se passar não dá certo...
vitor_lima

Faz tempo que eu não uso awt ou swing, mas uma vez eu já fiz um teclado virtual e me lembro que
deixei os botões sem a “habilidade” de receber o foco.

Não me lembro bem qual é o método que permite fazer isso, mas acho que é um focusable(bollean b)

E outra coisa, colocquei o código que passava o texto correspondente ao botão em um actionEvent,

assim não precisava fazer um método diferente para cada botão…

pedroroxd

vlw vitor.. só vc mesmo =)

public void dexadisabled() {
        A.setFocusable(false);
        B.setFocusable(false);
        C.setFocusable(false);
        D.setFocusable(false);
        E.setFocusable(false);
        F.setFocusable(false);
        G.setFocusable(false);
        H.setFocusable(false);
        I.setFocusable(false);
        J.setFocusable(false);
        K.setFocusable(false);
        L.setFocusable(false);
        M.setFocusable(false);
        N.setFocusable(false);
        O.setFocusable(false);
        P.setFocusable(false);
        Q.setFocusable(false);
        R.setFocusable(false);
        S.setFocusable(false);
        T.setFocusable(false);
        U.setFocusable(false);
        V.setFocusable(false);
        W.setFocusable(false);
        X.setFocusable(false);
        Y.setFocusable(false);
        Z.setFocusable(false);
          
        J0.setFocusable(false);
        J1.setFocusable(false);
        J2.setFocusable(false);
        J3.setFocusable(false);
        J4.setFocusable(false);
        J5.setFocusable(false);
        J6.setFocusable(false);
        J7.setFocusable(false);
        J8.setFocusable(false);
        J9.setFocusable(false);
    }
E no botão simplesmente:
if (jTextField1.hasFocus()) {
     String m = jTextField1.getText();
     jTextField1.setText(m + "A");
     jTextField1.requestFocus(true);
 }  

 else {
     String m = jPasswordField1.getText();
     jPasswordField1.setText(m + "A");
     jPasswordField1.requestFocus(true);
 }
Criado 6 de outubro de 2009
Ultima resposta 7 de out. de 2009
Respostas 9
Participantes 4