Exibir uma mensagem de erro em uma aplicação Swing

Olá gente;

Minha dúvida é a seguinte, preciso validar o preenchimento correto de um TextField. No caso de não preenchimento deveria exibir uma mensagem de aviso. Criei um Label e uma variável booleana para testar a validação, mas não está adiantando.
Será que alguém pode me ajudar? Pode ser JOption. Não faz mal. Só preciso de um método que valide o preenchimento correto.

Valeu gente.

Esse é o código que fiz:

   [code]  private void validaCamposPreenchidos(){
	
	boolean valida = false;
			if(txtCodigoPrestador != null)
				valida = true;
			else
				jLabeMensagem.setText("Preeencha corretamente o código!");

}	[/code]

Ele desconsidera o IF e já cai “direto” no ELSE. Ou seja…de qualquer forma…preenchendo ou não ele exibe a mensagem.

Quer exibir uma mensagem ao usuário? Use o método showMessageDialog do JOptionPane.

valide string com Equals

http://www.leepoint.net/notes-java/data/expressions/22compareobjects.html

Você quer saber como validar ou exibir a mensagem?

Veja se assim funciona:

private void validaCamposPreenchidos(){   
       
    boolean valida = false;   
            if(!txtCodigoPrestador.getText(""))   
                valida = true;   
            else   
                jLabeMensagem.setText("Preeencha corretamente o código!");   
  
}  

Comparando txtCodigoPrestador != null você está fazendo a verificação de instância. Ou seja, se a tela está mostrando o jTextField, ele vai estar instanciado, logo nunca vai estar null.

private void validaCampo(){ String valor = campoTexto.getText(); if(valor==null || !(valor.trim().length()>0)){ JOptionPane.showMessageDialog(janela, "Digite um valor válido no campo", "Erro de validação", JOptionPane.ERROR_MESSAGE); } }

A variavel de instancia “txt…” realmente não é nula, pois ela está referenciando alguma coisa.

O que você deve comparar é o seu conteúdo, ou seja:

//se o conteúdo do JTextField não for igual a "" (nada if (!"".equals(seuTxt.getText()) valida = true; else ..continua o código

Na verdade existem vários jeitos de validar o valor no campo!

O mais poderoso, sem dúvida, é o uso de uma expressão regular…

[code]private boolean validaCampo(){
// Expressão regular para valores apenas numéricos
Pattern soNumeros = Pattern.compile("^[1-9]+[0-9]*$");

// Valor presente no campo
String valor = campoTexto.getText();

// Verificando se o valor não é nulo e se encaixa com a expressão
if(valor==null || !soNumeros.matcher(valor).matches()){
	
	JOptionPane.showMessageDialog( // Caixa de mensagem
		janela, // Janela da aplicação (opcional, pode ser null)
		"Digite um valor numérico válido no campo", // Mensagem
		"Erro de validação", // Título da caixa de mensagem
		JOptionPane.ERROR_MESSAGE // Ícone da caixa de mensagem
	);
	
	return false;
}

// Convertendo a String já validada para número
numero = Long.parseLong(valor);

// Exibindo o valor extraído no console
System.out.println(numero);

return true;

}[/code]

[quote=yorgan]Veja se assim funciona:

private void validaCamposPreenchidos(){   
       
    boolean valida = false;   
            if(!txtCodigoPrestador.getText(""))   
                valida = true;   
            else   
                jLabeMensagem.setText("Preeencha corretamente o código!");   
  
}  

Comparando txtCodigoPrestador != null você está fazendo a verificação de instância. Ou seja, se a tela está mostrando o jTextField, ele vai estar instanciado, logo nunca vai estar null.[/quote]

Na verdade, acredito que código mais adequado seria mais ou menos assim:


private void validaCamposPreenchidos(){   
       
    boolean valida = false;   
            if(! "".equals( txtCodigoPrestador.getText() )   )
                valida = true;   
            else   
                jLabeMensagem.setText("Preeencha corretamente o código!");   
  
}  

Ou seja, verifico se um String vazia tem o seu valor (VAZIO!) igual ao valor do texto do JInputText.
Assim, evita disparar um NullPointerExcpetion se teu objeto txtCodigoPrestador não for instanciado no momento que eu chamo “.getText()”.


  txtCodigoPrestador.getText().equals( "" ) ;   //Pode disparar um NullPointer caso  txtCodigoPrestador for nulo, concorda?!

Ah, e eu prefiro um Label com a mensagem que o JOptionPane. Acho menos feio, hehe

[]s

[quote=uchoaaa]Na verdade, acredito que código mais adequado seria mais ou menos assim:

[code]private void validaCamposPreenchidos(){

boolean valida = false;   
        if(! "".equals( txtCodigoPrestador.getText() )   )
            valida = true;   
        else   
            jLabeMensagem.setText("Preeencha corretamente o código!");   

}[/code]
Ou seja, verifico se um String vazia tem o seu valor (VAZIO!) igual ao valor do texto do JInputText.
Assim, evita disparar um NullPointerExcpetion se teu objeto txtCodigoPrestador não for instanciado no momento que eu chamo “.getText()”.[/quote]
Só lembrando que se txtCodigoPrestador for null também vai dar um NullPointerException!

:wink:

Mas seria estranho estar null o jTextFiled, afinal, essa ação é disparada de uma tela que o usuário está preenchendo os dados, não é? Posso estar viajando aqui, mas nunca testei colocar em um jPanel um jTextField não instanciado. Isso é possível?

[]´s

[quote=yorgan]Mas seria estranho estar null o jTextFiled, afinal, essa ação é disparada de uma tela que o usuário está preenchendo os dados, não é? Posso estar viajando aqui, mas nunca testei colocar em um jPanel um jTextField não instanciado. Isso é possível?

[]´s[/quote]
Num dá certo não (k k k k k), veja em anexo!

BUT o método não sabe se o atributo do tipo JTextField está instanciado ou não…

Não devemos contar com os ovos no forofofó da galinha, não é mesmo?

:wink:


não seria mais simples:

if (txt != null || !"".equals(txt.getText())) { ... }

[quote=peerless]não seria mais simples:

if (txt != null || !"".equals(txt.getText())) { ... }

Pra verificar se a String não é vazia sim…

Para verificar se além de não estar vazia a String possui o conteúdo correto… expressões regulares!

Expressões Regulares - Guia de Consulta Rápida

Using Regular Expressions in Java

Valeu Fox…funcionou. Agora só preciso ajustar para que a mensagem venha diferente para cada campo.
Acho que deve ter uma forma não é? Tenho cinco campos, cada um recebe um valor diferente. Se o usuário esquecer um dos campos, a mensagem me retorna o erro apontando o campo esquecido.

Abraço.

[quote=arthurgon]Valeu Fox…funcionou. Agora só preciso ajustar para que a mensagem venha diferente para cada campo.
Acho que deve ter uma forma não é? Tenho cinco campos, cada um recebe um valor diferente. Se o usuário esquecer um dos campos, a mensagem me retorna o erro apontando o campo esquecido.

Abraço.[/quote]
Tem várias formas…

Você pode criar um listener cuja instância será adicionada a todos os campos, fazendo ifs para verificar qual é o campo (meio gambi)…

Ou identificar os campos com IDs e fazer um switch no listener (meio gambi tbm)…

Ou ainda utilizar um ENUM (mais elegante)…

Ou extender JTextField criando uma classe abstrata com um método abstrato valida() e extender essa classe para cada campo específico mudando apenas o método de validação… (na minha opinião a maneira mais elegante e flexível, de fácil manutenção, permitindo facilmente a criação de novos campos e utilizando polimorfismo)…

:wink:

Vou preparar um exemplo…

Achei um jeito até bem mais fácil, veja:

[code]package exemplo;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;

public class Janela extends JFrame {

private JTextField campoNumerico;
private JTextField campoNotNull;
private JButton botaoOk;

public Janela(){
	JPanel painel = new JPanel();
	campoNumerico = new JTextField();
	campoNumerico.setPreferredSize(new Dimension(100, 20));
	painel.add(campoNumerico);
	painel.add(new JLabel("Campo Numérico"));
	this.add(painel, BorderLayout.NORTH);
	
	painel = new JPanel();
	campoNotNull = new JTextField();
	campoNotNull.setPreferredSize(new Dimension(100, 20));
	painel.add(campoNotNull);
	painel.add(new JLabel("Campo Not Null"));
	this.add(painel, BorderLayout.CENTER);
	
	botaoOk = new JButton("OK");
	botaoOk.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent e) {
			validaCampos();
		}
	});
	this.add(botaoOk, BorderLayout.SOUTH);
	
	this.pack();
	
	this.setResizable(false);
	
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	this.setVisible(true);
}

private void validaCampos() {
	boolean todosValidos = true;
	
	// Chamar para cada campo...
	todosValidos = todosValidos && validaCampo(
		campoNumerico,
		"^[1-9]+[0-9]*$",
		"Digite um valor numérico válido no campo numérico"
	);
	
	todosValidos = todosValidos && validaCampo(
		campoNotNull,
		"^.+$",
		"Não deixe o campo not null vazio"
	);
	
	if(todosValidos){
		JOptionPane.showMessageDialog( // Caixa de mensagem   
            this, // Janela da aplicação (opcional, pode ser null)   
            "Campos ok!", // Mensagem   
            "Sucesso", // Título da caixa de mensagem   
            JOptionPane.INFORMATION_MESSAGE // Ícone da caixa de mensagem   
        );
	} else {
		JOptionPane.showMessageDialog( // Caixa de mensagem   
            this, // Janela da aplicação (opcional, pode ser null)   
            "Há campos inválidos", // Mensagem   
            "Erro de validação", // Título da caixa de mensagem   
            JOptionPane.ERROR_MESSAGE // Ícone da caixa de mensagem   
        );
	}
}

/**
 * Valida um campo de texto qualquer (JTextField, JTextArea, etc...)
 * Utiliza a expressão regular fornecida
 * Em caso de erro exibe a mensagem fornecida
 * @param campo
 * @param expressao
 * @param mensagem
 * @return validade do valor do campo
 */
private boolean validaCampo(JTextComponent campo, String expressao, String mensagem){
	String valor = campo!=null?campo.getText().trim():null;
	// Verificando se o valor se encaixa com a expressão
	if(!Pattern.compile(expressao).matcher(valor).matches()){
        JOptionPane.showMessageDialog( // Caixa de mensagem   
            this, // Janela da aplicação (opcional, pode ser null)   
            mensagem, // Mensagem   
            "Erro de validação", // Título da caixa de mensagem   
            JOptionPane.ERROR_MESSAGE // Ícone da caixa de mensagem   
        );
        return false;
	}
	return true;
}

public static void main(String[] args) {
	new Janela();
}

}[/code]
Pronto, modifiquei o código e pode ser executado pra ver o resultado…

A janela não é a coisa mais linda do mundo (hehuehuehue), mas funciona…

[quote=Fox McCloud][quote=uchoaaa]Na verdade, acredito que código mais adequado seria mais ou menos assim:

[code]private void validaCamposPreenchidos(){

boolean valida = false;   
        if(! "".equals( txtCodigoPrestador.getText() )   )
            valida = true;   
        else   
            jLabeMensagem.setText("Preeencha corretamente o código!");   

}[/code]
Ou seja, verifico se um String vazia tem o seu valor (VAZIO!) igual ao valor do texto do JInputText.
Assim, evita disparar um NullPointerExcpetion se teu objeto txtCodigoPrestador não for instanciado no momento que eu chamo “.getText()”.[/quote]
Só lembrando que se txtCodigoPrestador for null também vai dar um NullPointerException!

:wink:[/quote]

Ops, falei besteira! :roll: :stuck_out_tongue:

Na verdade, me confundi. Esqueci que o valor String é obtido a partir de um método de um objeto. Realmente, se ele for null, vai dar NullPointer!
Quis dizer que quando trabalha-se com diretamente com String funciona.

Dêem uma olhada:


Ah, outra coisa… É bem melhor trabalhar com StringUtils da biblioteca Commons :wink:
http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html

[]s