Ajuda com JTextField + requestFocus()

Prezados Colegas,

Estou com um problema em um formulário onde existem 3 campos:

JTextField usuario
JPassowordField senha
JTextField curso

e três botôes:

JButton confirma
JButton criarCurso
JButton sair

A lógica que estou tentando implementar é a seguinte:

  • O usuário preenche o primeiro campo (usuario) e pressiona Tab para ir ao campo senha;
  • Ao perder o foco do campo usuario, chamo um método que o valida;
  • Caso não seja validado, retorna ao campo usuario (uso um usuario.requestFocus());
  • Estando validado o usuario, deve ser preenchido o campo senha, o qual ao perder o foco chamo um método para validar a senha;
  • Caso esteja errada, deve apagar o que foi preenchido no campo senha e no campo usuario, retornando ao campo usuario para recomeçar o procedimento;
  • Caso senha válida, ao perder o foco, passa para o campo curso, executando a mesma rotina do campo senha, ou seja: se não for um curso valido, retorna ao campo usuario.

O que está ocorrendo: quando o campo senha é inválido (em branco ou senha errada), ao pressionar a tecla Tab, a aplicação entra em um loop infinito de “curso inválido”.

Alguém poderia dar uma ajuda? Já consultei o Javadoc da SUN sobre eventos e foco, mas não foi muito esclarecedor.

Agradeço antecipadamente qualquer ajuda.

Atenciosamente,

Augusto Cesar

Ok, mas eu gostaria que o foco voltasse ao campo curso, ou seja, se o usuário digita um curso que não é válido, o cursor deveria voltar para este campo até que ele preencha com um valor correto ou clique no botão Sair (o que também não está acontecendo…)

Vou colocar o trecho do código em questão:

     public void focusLost(FocusEvent evt)
     {
			Object obj = evt.getSource();

			String usuario = textFieldUsuario.getText();
			String password = new String(passwordFieldSenha.getPassword());
			String curso   = textFieldCurso.getText();

			if (obj == textFieldUsuario)
      	{
				if(!ss.usuarioOk(usuario))
				{
       			textFieldUsuario.setText("");
       			textFieldUsuario.requestFocus();
       		}
			}
			else
			{
				if (obj == passwordFieldSenha)
     			{
					if (!ss.senhaOk(usuario, password))
					{
						textFieldUsuario.setText("");
						passwordFieldSenha.setText("");
						textFieldUsuario.requestFocus();
					}
				}
				else
					if (obj == textFieldCurso)
  					{
						if(!ss.cursoValido(curso))
						{
							textFieldCurso.setText("");
							textFieldUsuario.requestFocus(); // Aqui volta para o campo usuario
						                                                       // mas gostaria que voltasse para curso
                                                 }
					else
						if (ss.existeCurso(curso))
						{
							jButtonOK.setEnabled(true);
							jButtonCRIAR.setEnabled(false);
						}
						else
						{
							if(ss.sPapel(usuario).equals("Professor"))
							{
								jButtonOK.setEnabled(false);
								jButtonCRIAR.setEnabled(true);
							}
						}
					}
				}
		   }

Aí é que está o X do problema: se eu coloco o foco para o campo curso, entra em loop contínuo, e só sai com CTRL+C.

Qual o mistério? Se no campo usuário, funciona perfeitamente, mas no campo curso, dá esse problema…

Veja a alteração:

	if (obj == textFieldCurso)
  	{
	    if(!ss.cursoValido(curso))
	    {
		textFieldCurso.setText("");
		textFieldCurso.requestFocus();
	    }

Isso por causa da sua implementação do metodo focusLost();

Tente incluir a logica dentro de um if else
Por exemplo:

if (!senha.getText.equals("")) {
    // todo codigo validador de usuario e senha aqui
}

Altere esse trecho do código:

if(!ss.cursoValido(curso))  {  
    textFieldCurso.setText("");  
    // então é só alterar essa linha. 
    // Voce definiu que o foco deve ir para o campo usuario, coloque para ir para o campo curso
    textFieldCurso.requestFocus();
}