Problemas com foco no jTextField

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.?

}

Agradeço desde já.

Oi,

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 ?

Tchauzin!

É 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?

Será que alguém poderia me responder?

Oi,

Sim são comandos semelhantes.

Você pode adicionar um FocusListener e utilizar a função FocusLost() para seus textfield… ou então fazer.:

if (textfield.getText().isEmpty()) { JOptionPane.showMessage.....(null,"Campo obrigatório); textfield.requestFocus(); }

Note que no seu primeira post (primeiro exemplo) você está requisitando o foco em outro componente e não o da comparação. (jTextField e jTextField1)

Tchauzin!

Lina me responde uma coisa.

Por exemplo se eu fizer assim.

if(jTextField1.getText().equals(""){ //faça alguma coisa. }

É a mesma coisa se eu fizer assim.

if(jTextField1.getText().isEmpty){ //faça alguma coisa. }

Bom, na verdade o foco uso uma classe interna que implementa FocusAdapter e lá eu codifico o método focusLost Assim:

  
  public void focusLost(FocusEvent evt){
       if(jTextField1.getText().equals(""){
            JOptionPane.showMessage("");
            jTextField1.requestFocus();
       }
  } 

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?
            }
       }
   }

Quem souber por favor poste aqui.

Oi,

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

});[/code]

É um “trambique”, porém funcionou!

Tchauzin!

Bom, continua com o mesmo problema.

Eu coloquei assim:

   private class focusHandler extends FocusAdapter{
        private boolean id_Focus = false;
        

        @Override
         public void focusGained(FocusEvent evt){
                 if(id_Focus){
                       JOptionPane.showMessageDialog(null,"Campo Obrigatório","Alerta",JOptionPane.WARNING_MESSAGE);//Isso aqui fica aparecendo diversas vezes
                       jTextField1.requestFocus();
                 }
         }

          @Override
         public void focusLost(FocusEvent evt){
              if(jTextField1.getText().isEmpty()){
                  id_Focus = !id_Focus;
                  jTextField1.requestFocus();
              }
         }
   }

Pronto Resolvi.

O erro tava em dar um segundo jTextField1.requestFocus() no método focusLost.

Corrigindo, funciona mas mesmo assim fica com bug.

Quando eu clico em algum botão ele dispara, mas se passo de jTextField para outro, ele simplesmente não dispara o focusListener.