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

18 respostas
arthurgon

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:

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

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

18 Respostas

fiaux

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

T

valide string com Equals

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

fiaux

Você quer saber como validar ou exibir a mensagem?

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.

Fox_McCloud

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

peerless

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

Fox_McCloud

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

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;
}
U

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.

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

Fox_McCloud
uchoaaa:
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()".
Só lembrando que se txtCodigoPrestador for null também vai dar um NullPointerException!

:wink:

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

Fox_McCloud

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


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:


peerless

não seria mais simples:

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

[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

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.

Fox_McCloud

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.


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…

Fox_McCloud

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

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

U
Fox McCloud:
uchoaaa:
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()".
Só lembrando que se txtCodigoPrestador for null também vai dar um NullPointerException!

:wink:

Ops, falei besteira! :roll: :P

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:

U

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

Criado 8 de julho de 2008
Ultima resposta 8 de jul. de 2008
Respostas 18
Participantes 7