eu vi o tutorial da sun e pelo q entendi deve ser criado um inputverifier p/ cada tela…eh isso msm??? :roll:
obs.: estou fazendo uma aplicacao desktop em swing
eu vi o tutorial da sun e pelo q entendi deve ser criado um inputverifier p/ cada tela…eh isso msm??? :roll:
obs.: estou fazendo uma aplicacao desktop em swing
Na verdade, deve-se instanciar um para cada controle.
:shock:
como assim p/ cada controle??? :?
Pra cada JTextField, JTextArea, JComboBox ou o que quer que vc queira validar
eles devem criados como inner class ou nao eh mto profissional fazer isso???
Eles devem ser criados de um jeito que o codigo seja facil de ler, ue.
eu fiz o meu InputVerifier e coloqei ele no setInputVerifier() do um JTextField…mas qndo coloco um valor invalido e aperto tab ou clico em otro campo, o programa trava :roll: pq? :?: :?:
Huh!? Qual o stack trace?
num tem nenhum stack trace
esse eh meu inputverifier
[code]package control;
import javax.swing.JTextField;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
public class NumberFieldVerifier extends javax.swing.InputVerifier implements java.awt.event.ActionListener {
private boolean allowzero;
DecimalFormat df;
public NumberFieldVerifier(boolean allowzero){
this.allowzero=allowzero;
df=new DecimalFormat("#,##0.00",new DecimalFormatSymbols(new Locale(“pt”,“BR”)) );
}
public boolean shouldYieldFocus(javax.swing.JComponent input) {
if(verify(input)){
return true;
}else{
//java.awt.Toolkit.getDefaultToolkit().beep();
javax.swing.JOptionPane.showMessageDialog(null, "valor inválido");
return false;
}
}
public boolean verify(javax.swing.JComponent input) {
float valor;
try{
valor= df.parse( ((JTextField) input).getText() ).floatValue();
}catch (java.text.ParseException pe){return false;}
if(! allowzero){ //ñ permite zero
if( valor==0){return false;}
}
return checkField(valor);
}
public boolean checkField(float valor){
boolean valid;
if(valor>0){formata();valid=true;}else{valid=false;}
return valid;
}
public void formata(){}
public void actionPerformed(java.awt.event.ActionEvent e) {
JTextField campo= (JTextField) e.getSource();
shouldYieldFocus(campo);
campo.selectAll();
}
}
[/code]
:?
Estive trabalhando com isso agora também, e pelo que percebi, quando vc executa o JOptionPane.showMessage de dentro do InputVerifier, na verdade vc está tentar sair do campo novamente, pois o foco irá para a tela de mensagem que está sendo aberta, aih será executado o verify novamente e a cada vez que vc lançar a mensagem.
Ocorrendo um StackOverflow
ainda estou tentar solucionar isto mas por enquanto não consegui.
Abraços, Décio
Décio já fiz exatamente o que descreveu e não ocorre o que você falou. Tanto que no próprio tutorial da Sun é implementada esta funcionalidade.
http://java.sun.com/docs/books/tutorial/uiswing/misc/example-1dot4/InputVerificationDialogDemo.java
Tem razão LIPE, verifiquei a url que me passou e realmente funciona.
A questão é que deve-se desistalar o InputVerifier antes de mostrar a mensagem e reinstalar depois.
muito obrigado.
Décio Luckow
:shock: :?: :? q??? como faco isso?
eh assim…
Voce sobrescreve o metodo shouldYieldFocus e caso o teste nao seja válido, seta null pro inputVerifier, mostra a mensagem e depois reinstala o inputVerifier “input.setInputVerifier(this)”
.
public boolean shouldYieldFocus(JComponent input) {
if (!super.shouldYieldFocus(input)) {
input.setInputVerifier(null);
JOptionPane.showMessageDialog(null, "Data inválida!");
input.setInputVerifier(this);
return false;
}
return true;
}
o q vc tah testando aki? :roll: :?
if (!super.shouldYieldFocus(input))
Pessoal, estive verificando e encontrei um problema extranho no exemplo http://java.sun.com/docs/books/tutorial/uiswing/misc/example-1dot4/InputVerificationDialogDemo.java
e que também acontece na minha implementacao deste recurso.
A questão é que quando é digitado um valor inválido, a mensagem é exibida e apos fechar a mensagem, o foco permanece no campo. Mas a primeira ‘tecla’ (letra/numero etc…) que digitamos no campo não tem efeito algum, somente a partir da segunda é que os valores voltam a aparecer.
Isto é péssimo, pois o usuário acham que está digitando um valor, e quando vai ver, está fantando o primeiro caracter do texto.
Preciso de ajuda, alguém tem alguma idéia?
Eureka, encontrei a solução deste problema:
é relativo ao BUG http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4966550
nesta página tem a correção
ufa!