InputVerifier

16 respostas
Lich_King

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

16 Respostas

B

Na verdade, deve-se instanciar um para cada controle.

Lich_King

:shock:
como assim p/ cada controle??? :?

cv1

Pra cada JTextField, JTextArea, JComboBox ou o que quer que vc queira validar :wink:

Lich_King

eles devem criados como inner class ou nao eh mto profissional fazer isso???

cv1

Eles devem ser criados de um jeito que o codigo seja facil de ler, ue. :wink:

Lich_King

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

cv1

Huh!? Qual o stack trace?

Lich_King

num tem nenhum stack trace

esse eh meu inputverifier
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();
    }
    
}

:?

Decio_Luckow

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

_fs

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

Decio_Luckow

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

Lich_King

:shock: :?: :? q??? como faco isso?

Decio_Luckow

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

Lich_King

o q vc tah testando aki? :roll: :?

if (!super.shouldYieldFocus(input))
Decio_Luckow

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?

Decio_Luckow

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:

Criado 2 de fevereiro de 2005
Ultima resposta 10 de mar. de 2005
Respostas 16
Participantes 5