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:
privatevoidvalidaCamposPreenchidos(){
booleanvalida=false;if(txtCodigoPrestador!=null)valida=true;elsejLabeMensagem.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.
Você quer saber como validar ou exibir a mensagem?
yorgan
Veja se assim funciona:
privatevoidvalidaCamposPreenchidos(){booleanvalida=false; if(!txtCodigoPrestador.getText(""))valida=true; elsejLabeMensagem.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...
privatebooleanvalidaCampo(){// Expressão regular para valores apenas numéricosPatternsoNumeros=Pattern.compile("^[1-9]+[0-9]*$");// Valor presente no campoStringvalor=campoTexto.getText();// Verificando se o valor não é nulo e se encaixa com a expressãoif(valor==null||!soNumeros.matcher(valor).matches()){JOptionPane.showMessageDialog(// Caixa de mensagemjanela,// 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 mensagemJOptionPane.ERROR_MESSAGE// Ícone da caixa de mensagem);returnfalse;}// Convertendo a String já validada para númeronumero=Long.parseLong(valor);// Exibindo o valor extraído no consoleSystem.out.println(numero);returntrue;}
U
uchoaaa
yorgan:
Veja se assim funciona:
privatevoidvalidaCamposPreenchidos(){booleanvalida=false; if(!txtCodigoPrestador.getText(""))valida=true; elsejLabeMensagem.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:
privatevoidvalidaCamposPreenchidos(){booleanvalida=false; if(!"".equals(txtCodigoPrestador.getText()))valida=true; elsejLabeMensagem.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:
privatevoidvalidaCamposPreenchidos(){booleanvalida=false; if(!"".equals(txtCodigoPrestador.getText()))valida=true; elsejLabeMensagem.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?
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)…
Vou preparar um exemplo…
Fox_McCloud
Achei um jeito até bem mais fácil, veja:
packageexemplo;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.util.regex.Pattern;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JTextField;importjavax.swing.text.JTextComponent;publicclassJanelaextendsJFrame{privateJTextFieldcampoNumerico;privateJTextFieldcampoNotNull;privateJButtonbotaoOk;publicJanela(){JPanelpainel=newJPanel();campoNumerico=newJTextField();campoNumerico.setPreferredSize(newDimension(100,20));painel.add(campoNumerico);painel.add(newJLabel("Campo Numérico"));this.add(painel,BorderLayout.NORTH);painel=newJPanel();campoNotNull=newJTextField();campoNotNull.setPreferredSize(newDimension(100,20));painel.add(campoNotNull);painel.add(newJLabel("Campo Not Null"));this.add(painel,BorderLayout.CENTER);botaoOk=newJButton("OK");botaoOk.addMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEvente){validaCampos();}});this.add(botaoOk,BorderLayout.SOUTH);this.pack();this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}privatevoidvalidaCampos(){booleantodosValidos=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 */privatebooleanvalidaCampo(JTextComponentcampo,Stringexpressao,Stringmensagem){Stringvalor=campo!=null?campo.getText().trim():null;// Verificando se o valor se encaixa com a expressãoif(!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 );returnfalse;}returntrue;}publicstaticvoidmain(String[]args){newJanela();}}
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
uchoaaa
Fox McCloud:
uchoaaa:
Na verdade, acredito que código mais adequado seria mais ou menos assim:
privatevoidvalidaCamposPreenchidos(){booleanvalida=false; if(!"".equals(txtCodigoPrestador.getText()))valida=true; elsejLabeMensagem.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.