Problemas com foco no jTextField

10 respostas
marcoslogan

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

10 Respostas

lina

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!

marcoslogan

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

lina

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!

marcoslogan

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. }
marcoslogan

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

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  o foco. Eu gostaria de saber por que?
            }
       }
   }

Quem souber por favor poste aqui.

lina

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 ?

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

É um "trambique", porém funcionou!

Tchauzin!

marcoslogan

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

Pronto Resolvi.

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

marcoslogan

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.

Criado 11 de agosto de 2009
Ultima resposta 16 de ago. de 2009
Respostas 10
Participantes 2