Validação de formulários swing

Olá pessoas,

Eu criei este tópico pq gostaria de saber como vcs fazem a validação de formulários swing, de repente algumas dicas e tal. Qd digo validação acho q todos entendem q é algo como garantir q o os campos obrigatórios sejam preenchidos e da forma correta.
Não sei se existe algum framework para facilitar este tipo de ação ou não, ou algum componente pra isso. A maioria das minhas validações faço na mão mesmo, algo como:

try { if(jTextField.getText().length() > 0) { // preencher o objeto com o texto } else { throw new IllegalArgumentException("Preencha o campo de texto x"); } } catch(Exception ep) { if(ep instanceof IllegalArgumentException) { JOptionPane.showMessageDialog(janela, ep.getMessage(), "Erro preenchimento formulario", JOptionPane.ERROR_MESSAGE); } else { // tratamento do erro } }
E aí, q vcs fazem?

[quote=Gobain]Olá pessoas,

Eu criei este tópico pq gostaria de saber como vcs fazem a validação de formulários swing, de repente algumas dicas e tal. Qd digo validação acho q todos entendem q é algo como garantir q o os campos obrigatórios sejam preenchidos e da forma correta.
Não sei se existe algum framework para facilitar este tipo de ação ou não, ou algum componente pra isso. A maioria das minhas validações faço na mão mesmo, algo como:

try { if(jTextField.getText().length() > 0) { // preencher o objeto com o texto } else { throw new IllegalArgumentException("Preencha o campo de texto x"); } } catch(Exception ep) { if(ep instanceof IllegalArgumentException) { JOptionPane.showMessageDialog(janela, ep.getMessage(), "Erro preenchimento formulario", JOptionPane.ERROR_MESSAGE); } else { // tratamento do erro } }
E aí, q vcs fazem?[/quote]

Cara, tem uma parada - que eu nao lembro o nome, por isso chamei de parada :wink: - que eu usei num aplicativo que usava rich faces…

Não sei se vai funcionar pra vc pq eram parâmetros xml.

Nos campos tinham coisas como maxintegerdigits, minintegerdigits, intergeronly, allownull e coisas do tipo.

No fundo acho que é o que vc busca, mas exatamente para swing nao sei…

Eu uso o SwingBean. Ele já gera a tela automáticamente baseado em uma classe e arquivo XML e faz a validadção tb. A validação dele se faz de duas maneiras: Via mascara ou via regex.
Dá uma olhada: http://swingbean.sourceforge.net/

[quote=dmandrak]Cara, tem uma parada - que eu nao lembro o nome, por isso chamei de parada :wink: - que eu usei num aplicativo que usava rich faces…

Não sei se vai funcionar pra vc pq eram parâmetros xml.

Nos campos tinham coisas como maxintegerdigits, minintegerdigits, intergeronly, allownull e coisas do tipo.

No fundo acho que é o que vc busca, mas exatamente para swing nao sei…[/quote]

Então, eu vi que parecido com isso tem o InputVerifier, mas não é com xml (pelo menos não vi isso).

[quote=renzonuccitelli]Eu uso o SwingBean. Ele já gera a tela automáticamente baseado em uma classe e arquivo XML e faz a validadção tb. A validação dele se faz de duas maneiras: Via mascara ou via regex.
Dá uma olhada: http://swingbean.sourceforge.net/
[/quote]
O SwingBean é bacana, mas posso usá-lo só pra fazer a validação?

Gobain,

Não da pra usar ele só para fazer validação não. Mas qdo nao uso ele, uso a idéia. Extendo a text field colocando na classe um pattern. Aí coloco um método verify para validar o campo baseado em uma regex do campo. Assim, para validações diferentes só criar a refex apropriada, em vez de implementar o código todo na mão.

Ah sim, a regex resolve muitos problemas… E também tem a validação básica q é uma máscara num JFormattedTextField né, q resolve alguns problemas por não aceitar a entrada se não estiver no formato especificado, ou formata pra adequar.

Eu prefiro essa que você citou !
As vezes fico na dúvida também se estou fazendo da melhor forma .
O que você é alguma coisa como isso aqui :

Eu uso essa pra validar nomes pra poder salvar como arquivo .

JTextField jtextfield = new AddressField();

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class AddressField extends JTextField {

    private static final long serialVersionUID = -3994537649972878338L;

    public AddressField()    {
         this( null );
    }

    @SuppressWarnings("serial")
    public AddressField( String text ) {
       super(text);
       setDocument(new PlainDocument() {
           public void insertString( int offs, String str, AttributeSet a )
           throws BadLocationException {
               for( int i = 0; i < str.length(); i++ )
               if((Character.toString(str.charAt( i )).equals("/")) ||
                   (Character.toString(str.charAt( i )).equals("\\")) ||
                   (Character.toString(str.charAt( i )).equals(":")) ||
                   (Character.toString(str.charAt( i )).equals("*")) ||
                   (Character.toString(str.charAt( i )).equals("\"")) ||
                   (Character.toString(str.charAt( i )).equals("<")) ||
                   (Character.toString(str.charAt( i )).equals(">")))
               return;
               super.insertString( offs, str, a );
           }
       });
    }
}

è uma boa forma ?

Criar o Document pro JTextField ignorar alguns caracteres é bacana tb, mas será q não da pra simplificar a busca pelos caracs inválidos? Usar regex com Pattern e Matcher ao inves do if( a || b || c || … || n )?

Exatamente o que eu ia falar. O problema que o caracter especial para indicar letra e algarismos não aceitas os acentuados, aí tem que colocar na mão. Mas mesmo assim, acho mais elegante, mas aí é questão de gosto.
Eu tinha problemas com a mascara quando limpava o campo, para que possa ser feito outro cadastro.

[quote=renzonuccitelli]Exatamente o que eu ia falar. O problema que o caracter especial para indicar letra e algarismos não aceitas os acentuados, aí tem que colocar na mão. Mas mesmo assim, acho mais elegante, mas aí é questão de gosto.
Eu tinha problemas com a mascara quando limpava o campo, para que possa ser feito outro cadastro. [/quote]

Mas aí é uma questão de fazer a combinação certa. Essa regex aqui > "[^\p{L}\p{N}]" < tirei do blog do Rafael Lossurdo, só q ela elimina qualquer pontuação junto. O negócio mesmo é fazer a necessária pra cada caso.

[quote]Expressões Regulares
[:alnum:] Caracteres alfanuméricos, o que no caso de ASCII corresponde a [A-Za-z0-9].
[:alpha:] Caracteres alfabéticos, o que no caso de ASCII corresponde a [A-Za-z].
[:blank:] Espaço e tabulação, o que no caso de ASCII corresponde a [ \t].
[:cntrl:] Caracteres de controle, o que no caso de ASCII corresponde a [\x00-\x1F\x7F].
[:digit:] Dígitos, o que no caso de ASCII corresponde a [0-9]. O Perl oferece o atalho \d.
[:graph:] Caracteres visíveis, o que no caso de ASCII corresponde a [\x21-\x7E].
[:lower:] Caracteres em caixa baixa, o que no caso de ASCII corresponde a [a-z].
[:print:] Caracteres visíveis e espaços, o que no caso de ASCII corresponde a [\x20-\x7E].
[:punct:] Caracteres de pontuação, o que no caso de ASCII corresponde a [-!"#$%&’()*+,./:;<=>?@[\]_`{|}~].
[:space:] Caracteres de espaços em branco, o que no caso de ASCII corresponde a [ \t\r\n\v\f]. O Perl oferece o atalho \s, que, entretanto, não é exatamente equivalente; diferente do \s, a classe ainda inclui um tabulador vertical, \x11 do ASCII.[4]
[:upper:] Caracteres em caixa alta, o que no caso de ASCII corresponde a [A-Z].
[: xdigit:] Dígitos hexadecimais, o que no caso de ASCII corresponde a [A-Fa-f0-9].[/quote]