Alternando foco entre jTextField´s

Galera, bom dia!

Estou precisando de uma ajuda para colocar o foco nos campos de forma correta.

Tenho 4 jTextFields (que vamos chamar de jTF1, jTF2, jTF3, jTF4). Quando executo o programa, o foco está no jTF1, e os outros campos estão “travados”, onde só serão liberados respectivamente em sua ordem logo após o seu antecessor ser preenchido e o usuário apertar TAB e mudar de campo.

Preenche o jTF1, TAB, bloqueia o jTF1 e libera o JTF2, preenche-o, TAB, bloqueia o jTF2 e libera o jTF3 e assim sucessivamente.

A princípio usei os eventos FocusLost e FocusGained, mas quando preciso voltar em algum campo o programa fica todo bugado kkk

Alguém para dar uma luz nesse processo?

Você pode colocar um evento de KeyReleased em cada textField, por exemplo, no jTF1:

if (evt.getKeyCode() == KeyEvent.VK_TAB) { //Quando o foco estiver no jTF1 e vc apertar tab, ele vai mudar pro jTF2
    jTF2.setEnabled(true);
    jTF2.grabFocus();
}

Eu já vi em um post aqui bem antigo onde o ViniGodoy (que na minha humilde opinião, manja muito) disse que usar grabFocus() não é aconselhável para nossas aplicações e que o melhor eh usar o requestFocusInWindow().

Segue o link da matéria:

Ta la em baixo ele falando sobre isso.

Mas na sua opinião, devo usar o grabFocus() mesmo?

PS.: Não que você também não manje muito kk

1 curtida

Pô que legal, eu não havia lido este post ainda. É bem interessante, pra ser sincero eu uso o grabFocus(); e nunca obtive um erro ou algo que de diferente no sistema.

Vou começar a trocar para ver se noto alguma diferença, mas já que ele mostrou bastante exemplo com fontes sobre o assunto, creio que seria mais ideal usar o requestFocusInWindow(); mesmo!

1 curtida

Ai eu vi a humildade lá no teto! :hugs:

Mas no caso eu so trocaria o grabFocus() > requestFocusInWindow() certo?

1 curtida

Aproveitando o post, resolvi dar uma procurada sobre o assunto:

Um usuário perguntou: Eu gostaria de saber a diferença entre os métodos requestFocusInWindow(); e grabFocus();. Ambos funcionam bem para pegar o foco para mim neste programa. Portanto, não consegui entender a diferença.”


"Um usuário respondeu: A resposta é simples, grabFocus(); agarra o foco, não importa se o ancestral de nível superior é a janela focada. Se a janela não estiver ativa, ela será ativada para permitir que o componente obtenha o foco.

Considerando que, requestFocusInWindow(); obtém o foco para o componente no qual ele é chamado apenas quando seu ancestral de nível superior é a janela focada. "


Então acho que nesse caso dá pra dar uma entendida mais clara sobre o assunto, ficando assim, a critério do desenvolvedor!!

fonte: https://stackoverflow.com/questions/17680817/difference-between-requestfocusinwindow-and-grabfocus-in-swing

1 curtida

Isso!

Outra pergunta: la no initComponents() eu dou um setEnabled(false) no jTF2, jTF3 e no jTF4, deixando somente o primeiro disponível? Porque se eu não travar os outros, todos ja iniciam disponiveis.

E logo após eu dar o jTF2.setEnabled(true), não preciso por o jTF1 como false não?

Porque testando aqui não mudou nada, daí me veio essas dúvidas. :upside_down_face:

Resumindo: o grabFocus() é folgado kkkkk ele coloca o foco e não ta nem ai. Já o requestFocusInWindow() é educado kkkk e só é chamado se a janela correspondente ao campo onde irá ter foco estiver aberta.

Talvez seja pelo fato do grabFocus() ser folgado que o ViniGodoy disse que não é bom usarmos :thinking:

1 curtida

Cara, você pode fazer isso setando todos os componentes como setEnabled(false); direto neles mesmos, ou fazer como você disse, abaixo do initComponents():.

Mas você precisa bloquear o textField1 mesmo? Caso precise, tem que colocar ele como false mesmo

Ahh certo

No caso eu quero de fato é alternar o foco. Não está usando, deixa ele false e true o próximo, e assim vai.

Talvez você nunca fez um programa em que usou de fato esse aspecto folgado dele kkk

1 curtida

Entendi! Então teria que ser assim, só que não tem como editar assim. Só se utilizar um botão pra corrigir o campo e colocá-lo como true de novo, segue:

if (evt.getKeyCode() == KeyEvent.VK_TAB) {
    jTF1.setEnabled(false);
    jTF2.setEnabled(true);
    jTF2.grabFocus();
}

Sim! Geralmente eu uso apenas em JDialog, então como o foco é só dele, eu nunca percebi a diferença.

Você quer dizer no caso de o usuário errar na digitação e passar para o próximo campo, se ele der um SHIFT + TAB o campo não voltará com o foco, certo?

Pode ser também, não pensei nessa hipótese. Mas voltaria com o foco sim, com o foco e true

Eu fiz isso aqui nos meus 4 campos e não libera o próximo jTF. Vou te mostrar o código aqui:

private void jTFContaKeyReleased(java.awt.event.KeyEvent evt) {       // Aqui é o jTF1                              
    if (evt.getKeyCode() == KeyEvent.VK_TAB) { 
        jTFNome.setEnabled(true);
        jTFConta.setEnabled(false);
        jTFNome.requestFocusInWindow();
    }
}                                    

private void jTFNomeKeyReleased(java.awt.event.KeyEvent evt) {             // Aqui é o jTF2                        
    if (evt.getKeyCode() == KeyEvent.VK_TAB) { 
        jTFSaldo.setEnabled(true);
        jTFNome.setEnabled(false);
        jTFSaldo.requestFocusInWindow();
    }
}                                   

private void jTFSaldoKeyReleased(java.awt.event.KeyEvent evt) {                 // Aqui é o jTF3                     
    if (evt.getKeyCode() == KeyEvent.VK_TAB) { 
        jTFLimite.setEnabled(true);
        jTFSaldo.setEnabled(false);
        jTFLimite.requestFocusInWindow();
    }
}                                    

private void jTFLimiteKeyReleased(java.awt.event.KeyEvent evt) {                // Aqui é o jTF4                       
    if (evt.getKeyCode() == KeyEvent.VK_TAB) { 
        jTFSaldo.setEnabled(false);  // Aqui não tem mais campos para setar como "true", então eu apenas seto "false" o jTF3.
        jTFNome.requestFocusInWindow();
    }
}

O foco está no jTFConta pra vc começar a trocar os campos?

Exatamente! Nele, eu não deixei o enabled como false. Executando o programa ele começa como true, e os outros 3 false, dai vai passando.

Tenta com o grabFocus():

Não mudou nada. Continua false. (Tirei aquela parte que coloco false o anterior. Se assim der certo ai eu volto com essa parte de deixar false o que já foi digitado.)

To instalando o netbeans aqui no trampo kkkkkk, já testo aqui!

1 curtida