InputVerifier

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 :wink:

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

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! :smiley: