Oi pessoal eu consegui resolver o problema com o foco no Java.
Por exemplo eu tenho dois jTextField, o meu algoritmo que eu uso, para testar se o jTextField está vazio. é o seguinte:
if(jTextField.getText().equals(""){
//aqui eu coloco eu uso o método do JOptionPane
JOptionPane.showMessageDialog(“Alguma coisa”);
jTextField1.requestFocus();//aqui eu coloco o foco onde estiver vazio. Para o usuário, inserir algum dado.
//Só que quando o programa executa a última linha, a mensagem fica aparecendo diversas vezes, eu depurando o programa notei, que o componente não está segurando o foco, por alguma razão que eu desconheço. Será que alguém, que já passou por isso, poderia me dar uma dica de como proceder.?
Quando você postar na próxima vez, coloque seu código entre as tags ok?
Em relação a sua dúvida, irá ser apresentado o JOptionPane sempre que o jTextField estiver vazio. Obs.: No lugar de equals("") você pode utilizar o método isEmpty();
Não entendi a parte do segurar o foco no componente, pois o método requestFocus() apenas requisita ao componente o foco, o que é diferente de segurar o foco.
Note que na comparação do IF você está utilizando o campo jTextField e está requisitando no jTextField1. Era isso mesmo ?
É sim, o que eu quero que o meu programa Java, faça é que não deixar nenhum componente ficar vazio.
Se estiver vazio. Ele manda uma mensagem dizendo que aquele campo é importante para o bom funcionamento do sistema.
E depois ele seta o foco naquele jtextfield.
eu vou colocar aqui como eu faço em Delphi
if(Edit1.text = ‘’) then
begin
//Aqui eu passo a mensagem e depois seto o foco no componente que não estiver devidamente preechido, assim, não permitindo que ele avance no formulário.
Application.MessageBox();//Mensagem
Edit1.setFocus;
end;
o requestFocus() é o similar que o setFocus em Delphi?
Bom na verdade o problema aqui é que o programa ele executa o comando algumas vezes. Dando a impressão que o jTextField não segura o foco.
quando o programa executa o método da minha classe interna que estende a classe FocusAdapter.
Então o JOptionPane fica aparecendo muitas vezes.
Eu codifiquei assim:
private class focusHandler extends FocusAdapter{
public void focusLost(FocusEvent evt){
if(jTextField1.getText().isEmpty()){
JOptionPane.showMessageDialog("Isso fica aparecendo diversas vezes então toda que aparece tenho que ficar clicando ok.");
jTextField1.requestFocus();//Depois de alguns cliques o jTextField dá o foco. Eu gostaria de saber por que?
}
}
}
Quando fui responder na primeira vez, seria para usar o método FocusLost. Porém, notei esse mesmo problema quando fui fazer um teste em minha aplicação.
Analisando melhor (para saber o motivo), cheguei a uma conclusão.: Quando a janela do JOPtione é mostrada o campo continua sem o foco, ou seja, ele ainda está no campo do lado! e assim o FocusLost ainda está ativo e irá entrar varias vezes na condição do If.
Note que se você fazer assim, funciona corretamente.:
if (text.getText().isEmpty()) {
System.out.println("1");
text.requestFocus();
}
OBS.: O problema realmente está no JOptionPane;
Então pensei, pq não realizar a função quando ganhar o foco ?
[code]// Indicará quando ocorreu FocusLost.
boolean ib_focus_lost = false;
addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
// Se está sem foco (Note que a flag só é ativada se ele perdeu o foco e nao tem conteudo) ...
if (ib_focus_lost)
JOptionPane.showMessageDialog(null,"Campo obrigatório");
text.requestFocus();
}
@Override
public void focusLost(FocusEvent evt) {
// Se o conteudo estiver vazio ...
if (text.getText().isEmpty()) {
// Marca como true (Perdeu o foco)
ib_focus_lost = !ib_focus_lost;
text.requestFocus();
}
}