Teclado Virtual [RESOLVIDO]

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:

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

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.

Oi,

Esse código esta dentro de um KeyEvent ?

Tchauzin!

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!

[quote=lina]Oi,

Esse código esta dentro de um KeyEvent ?

Tchauzin![/quote]
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

Oi,

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

Tchauzin!

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

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.

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

});[/code]

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

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

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

Tchauzin!

Oi,

Nesse código, ele pede para passar o ib_flag para final:

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

}); [/code]
Mas se passar não dá certo…

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…

vlw vitor… só vc mesmo =)

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

E no botão simplesmente:

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