Validar dados de um jTextField exibindo mensagem de um jLabel

Tenho uma série de campos (jTextFields) onde o usuário digita valores. Criei jLabels para cada campo com mensagens indicando que o número deve ser maior/menor a “x” para o caso de estar fora de um “alcance” recomendado. Essas mensagens inicialmente estao “invisíveis” e gostaria que elas aparecessem apenas se o usuário digitar um valor fora do “alcance recomendado”.

Exemplo: Usuário digita “10” através do jTextField. O valor recomendado seria acima de 10. Tenho uma mensagem, dentro de um jLabel, “Recomenda-se usar um valor maior a 10”.

Minha dúvida é… Como fazer o “filtro” para exibir ou nao essa mensagem (que está no jLabel)? Como tornar a mensagem visível (sim, “setVisible(true)”, mas com que critério?)?

Ou seja, como especificar “maior” e “menor” no código? Porque quando uso “<” e “>” dá erro. Há algo similar ao “.equals”, só que para “maior e menor”? Imagino que tenha que pegar o texto através do “jTextField.getText()”, mas como fazer a parte do “maior” ou “menor”?

É algo muito simples mas nao estou conseguindo…

O jTextField.getText() vai te retornar uma String, para comparar com > e < você deve antes verificar se esse valor é um número convertendo a String, depois, validar com um if simples e exibir ou não o jLabel.

Exemplo:

int numero;
try {
    numero = Integer.parseInt(jTextField.getText());
} catch(NumberFormatException ex) {
    System.out.println("O valor informado não é um numérico inteiro válido");
}

if (numero < 10) {
    jLabel.setVisible(true);
}
1 curtida

Agradeco a ajuda, mas continua nao funcionando.

Testei isso em um campo. Para o campo tenho duas mensagens (uma para um valor mínimo, outra para um máximo). Ao abrir a tela onde estao os campos, a mensagem do valor máximo já é mostrada.

Deixei ambas em “false”, entao, em teoria, 1) a mensagem nao deveria aparecer antes dos valores serem digitados/ do if ser “executado”. 2) a mensagem é exibida mesmo com o valor digitado estando completamente fora do que foi programado no if.

Alguma ideia, companheiro? De todos os modos sigo aqui tentando resolver. Abs!

Se não está funcionando é porquê você está aplicando a lógica de forma errada!
Sem ver seu código não tenho como dizer nada a respeito!

Código com 1 dos campos, que foi o que eu usei pra testar com sua ideia:

jLabelTelaArenaVerdeLimiteMaxEspecimen.setVisible(false);
jLabelTelaArenaVerdeLimiteMinEspecimen.setVisible(false);

    double numeroEspecimen = 0;
    
    try {
        
        numeroEspecimen = Double.parseDouble(jTextFieldEspecimenArenaEnVerde.getText());
    } catch (NumberFormatException ex){
    }
    
    if (numeroEspecimen > 160 ){
        jLabelTelaArenaVerdeLimiteMaxEspecimen.setVisible(true);
    
    } else if (numeroEspecimen < 145 ) {
        jLabelTelaArenaVerdeLimiteMinEspecimen.setVisible(true);
    }

Repetindo, ao abrir a tela a mensagem de “número máximo” já está sendo exibida. Ao digitar valores no campo nada muda. Ao clicar em salvar na tela, tampouco.

E esse código está aplicado onde exatamente?

Porquê o trecho que você postou não mostra o acionamento dos eventos de focusLost do jTextField muito menos do click do botão!

Aqui eu tenho algo desse tipo:

private boolean animalValido(){
        txtNomeAnimal.setText(txtNomeAnimal.getText().trim());
        
        switch(opcaoAnimal){
            case 1:
                if(cbxCastaAnimal.getSelectedIndex() == OPCAO_INVALIDA){
                    cbxCastaAnimal.requestFocusInWindow();
                    cbxCastaAnimal.setBackground(new Color(255, 255, 50));
                    lblStatus.setForeground(Color.red);
                    lblStatus.setText("Preenchimento obrigatório: CASTA");
                    animalValido = false;
                }else{
                    passagemAnimal++;
                    opcaoAnimal = 2;
                    recomporCamposAnimal();
                    animalValido();
                }
                break;
            case 2:
                if(cbxRacaAnimal.getSelectedIndex() == OPCAO_INVALIDA){
                    cbxRacaAnimal.requestFocusInWindow();
                    cbxRacaAnimal.setBackground(new Color(255, 255, 50));
                    lblStatus.setForeground(Color.red);
                    lblStatus.setText("Preenchimento obrigatório: RAÇA");
                    animalValido = false;
                }else{
                    passagemAnimal++;
                    opcaoAnimal = 3;
                    recomporCamposAnimal();
                    animalValido();
                }
                break;
            case 3:
                if(txtNomeAnimal.getText().isEmpty() 
                        || txtNomeAnimal.getText().length() > 15){
                    txtNomeAnimal.requestFocusInWindow();
                    txtNomeAnimal.setBackground(new Color(255, 255, 204));
                    lblStatus.setForeground(Color.red);
                    lblStatus.setText("Preenchimento obrigatório: NOME");
                    telefoneValido = false;
                }else{
                    passagemAnimal++;
                    recomporCamposAnimal();
                    
                    if(passagemAnimal >= 3){
                        animalValido = true;
                        verificarInclusaoAnimal();
                    }
                }
                break;
        }
        return animalValido;
    }

Daí, no botão de salvar, antes de qualquer coisa eu testo passando esse método:

private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {
	if(animalValido()){
		try{
			salvar(retornarAnimal());
			
		}catch(SQLException sqle){
			System.out.println(sqle.getMessage());
		}
	}
}

No botão Novo:

private void btnNovoActionPerformed(java.awt.event.ActionEvent evt) {                                        
        opcao = INICIO;
        opcaoTelefone = INICIO;
        opcaoAnimal = INICIO;
        salvar = true;
        habilitarCadastramento();
        if(clientes.isEmpty()){
            txtCodigo.setText(String.valueOf(idCliente));
        }else{
            int id = idCliente;
            txtCodigo.setText(String.valueOf(++id));
        }
        painelAbas.setSelectedIndex(ABA_ENDERECO);
        txtNomeCliente.requestFocusInWindow();
        btnNovo.setEnabled(false);
        redefinirBotaoSalvar(true);
        limparCampos();
    }      

Onde INICIO: private final int INICIO = 1;

Daí sempre quando clico para cadastrar um novo animal, ele indica a opção 1 para o switch.

Toda vez que há um campo não preenchido, ele chama (recursão) o método animalValido(). Enquanto esse campo não é preenchido, ele marca o campo de amarelo, o label lblStatur para cor vermelha e indica “Preenchimento obrigatório: CAMPO X”.

Eu resolvi o meu problema assim. Se alguém tiver uma maneira mais enxuta/elegante de fazer, estou aberto a sugestões. No meu caso, a minha tela é formada por diversas abas (Endereço, Telefones e Animais), e para cada campo de cada aba há uma validação desse tipo, por isso o uso do switch() [somente uma fração do código foi postada].

Amigo, eu desconhecia os conceitos de “FocusLost”.

Pesquisei, adicionei e funcionou. Valeu demais!!

Show de bola, cara. Creio que meu problema era um pouquinho mais simples, mas agradeco a ajuda.

Abs!

Eu trocaria esse if-else

if (numeroEspecimen > 160 ) {
    jLabelTelaArenaVerdeLimiteMaxEspecimen.setVisible(true);

} else if (numeroEspecimen < 145 ) {
    jLabelTelaArenaVerdeLimiteMinEspecimen.setVisible(true);
}

por isso:

jLabelTelaArenaVerdeLimiteMaxEspecimen.setVisible(numeroEspecimen > 160);
jLabelTelaArenaVerdeLimiteMinEspecimen.setVisible(numeroEspecimen < 145);