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
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?
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!
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!!
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.
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
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
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?
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();
}
}
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.)