MAXLENGHT + JTextField + Swing + Beansbinding

Boa tarde.

Gostaria de utilizar o espaço para deixar meu ponto de vista e fazer uma pergunta.
Estou um tanto quanto desencontrado do fato do JTextField do java não ter o MAXLENGHT.
É claro vi maneiras de como resolver este problema como em :
http://www.guj.com.br/article.show.logic?id=29

Porém esta não é a solução de tudo.

Em meu projeto tenho a seguinte situação: um jTextField que fica vinculado a uma linha de uma Jtable.
Ao tentar utilizar como descrito no link acima, definir o tamanho máximo não funciona.
Veja o código de vinculação estipulado pelo Netbeans.

jtfPronomeDeTratamento = new javax.swing.JTextField();
org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, jtbPronomes, org.jdesktop.beansbinding.ELProperty.create("${selectedElement.pronome}"), jtfPronomeDeTratamento, org.jdesktop.beansbinding.BeanProperty.create("text"));
binding.setSourceUnreadableValue(null);
bindingGroup.addBinding(binding);
binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ, jtbPronomes, org.jdesktop.beansbinding.ELProperty.create("${selectedElement != null}"), jtfPronomeDeTratamento, org.jdesktop.beansbinding.BeanProperty.create("enabled"));
bindingGroup.addBinding(binding);

jtfPronomeDeTratamento.addKeyListener(formListener);

Veja que meu JTextField trabalha com o beansbinding cujo código o proprio Netbeans gera após gerar a vinculação.

Não sei …
Preciso limitar este tamanho, porém já após cansáveis pesquisas ainda não encontrei a solução
Acredito que aqui, com tantas pessoas mais experientes, posso encontrar a ajuda.
Alguém ja passou por isso? Como Resolver?

Grato

Flavio, tive o mesmo problema que vc. Resolvi fazendo uma verificação de quantidade de caracteres digitados, toda vez que um componente jText recebe um focusLost. Não é bonito, nem elegante e nem o que eu queria, mas a principio o meu problema foi resolvido. Se tiver encontrado uma solucao de outra forma, favor compartilhar!

Abraço,

Olá marcosfmr.

Desde já agradeço por sua resposta e ajuda ao tentar resolver este problema.
Como você mesmo disse:

"Não é bonito, nem elegante e nem o que eu queria, mas a principio o meu problema foi resolvido. "

Realizei o seguinte para poder resolver este problema:

No KeyReleased do componente, coloquei um substring para cortar o tamanho. Veja:

    private void jtfNomePacienteKeyReleased(java.awt.event.KeyEvent evt) {                                            
        if (jtfNomePaciente.getText().length() > 100) {
            jtfNomePaciente.setText(jtfNomePaciente.getText().substring(0, 100));
        }
    } 

O código acima a cada tecla que solta no textfield eu verifico o seu tamanho, se for maior que 100 eu corto ela.

O problema resolve.Porem surge mais um problema, que no caso era o que gostaria de resolver.

Para cada componente sou obrigado a realizar isto, enquanto na verdade eu gostaria de conseguir algo mais genérico que pudesse ser utilizado em mais de um componente ser precisar ficar definindo keyrelesead para cada um deles. Quem sabe sobre escrever algum método do swingo ou algo assim.

Agradeço sua ajuda.

Caso tiver mais sugestão não hesite em deixar aqui para que possa ajudar mais pessoas que tenham este mesmo problema.

Grato.

Extende a classe JTextField, e sobrescreve o método do KeyReleased. Depois adiciona a classe a paleta (no caso do NetBeans) e aí vc vai ter um componente personalizado com essa caracteristica.

Espero ter ajudado.

Para limitar a capacidade máxima de um JTextField, aplique a ele um Document personalizado:

http://www.exampledepot.com/egs/javax.swing.text/LimitText.html

Esta abordagem permite criar sem complicações um componente reutilizável.

Pessoal, fiz isso a algum tempo…

package componentes;

/**
 *
 * @author lucaspaz
 */

import javax.swing.text.*;

public class FixedLengthDocument extends PlainDocument {

    private int iMaxLength;

    public FixedLengthDocument(int maxlen) {
        super();
        iMaxLength = maxlen;
    }

    @Override
    public void insertString(int offset, String str, AttributeSet attr)
            throws BadLocationException {

        if (iMaxLength <= 0) // aceitara qualquer no. de caracteres
        {
            super.insertString(offset, str, attr);
            return;
        }

        int ilen = (getLength() + str.length());
        if (ilen <= iMaxLength) // se o comprimento final for menor...
        {
            super.insertString(offset, str, attr);   // ...aceita str
        }
    }
}

agora o código do textfield modificado…

public class jCtextfield extends JTextField {

public void setTamanhoMax(int tamanho) {
        this.setDocument(new FixedLengthDocument(tamanho));
    }
}

qualque duvida pode falar…

[quote=lucaspaz]Pessoal, fiz isso a algum tempo…

package componentes;

/**
 *
 * @author lucaspaz
 */

import javax.swing.text.*;

public class FixedLengthDocument extends PlainDocument {

    private int iMaxLength;

    public FixedLengthDocument(int maxlen) {
        super();
        iMaxLength = maxlen;
    }

    @Override
    public void insertString(int offset, String str, AttributeSet attr)
            throws BadLocationException {

        if (iMaxLength <= 0) // aceitara qualquer no. de caracteres
        {
            super.insertString(offset, str, attr);
            return;
        }

        int ilen = (getLength() + str.length());
        if (ilen <= iMaxLength) // se o comprimento final for menor...
        {
            super.insertString(offset, str, attr);   // ...aceita str
        }
    }
}

agora o código do textfield modificado…

public class jCtextfield extends JTextField {

public void setTamanhoMax(int tamanho) {
        this.setDocument(new FixedLengthDocument(tamanho));
    }
}

qualque duvida pode falar…
[/quote]

… o foco do post é fazer com que o jtextField não perca o Document depois do binding, o que ninguem respondeu e nem deu idéias!!!
Mesmo usando a “grande sacada” do lucaspaz, de vc usar vinculo( binding ) esse seu document já era.
http://java.net/jira/browse/BEANSBINDING-36

http://java.net/jira/browse/BEANSBINDING-36

Resumindo…
SE QUIZEREM PERSONALIZAR DOCUMENT PARA JTEXTFIELDS E USAR BEANSBINDING, ATÉ AGORA NA VERSAO 1.2.1 DO BEANSBINDING É IMPOSSÍVEL… UTILIZEM O JFORMATTEDTEXTFIELD QUE A FORMATAÇÃO DO DOCUMENT NÃO É IGNORADA PELO BEANSBINDING…

TOMARA QUE NA VERSÃO NOVA DO BEANSBINDING ISSO JÁ ESTEJA RESOLVIDO.

Olá pessoal!
Sei que já tem um tempo o tópico, eu também passei por este problema e consegui resolver implementado
um DocumentFilter ao invés de usar o PlainDocument para limitar o tamanho dos campos jTextField, e para
o binding estou utilizando a beansbiding-1.2.1 um exemplo da utilização do DocumentFilter pode ser encontrado em http://www.java2s.com/Code/JavaAPI/javax.swing.text/AbstractDocumentsetDocumentFilterDocumentFilterfilter.htm
o exemplo do link é apenas para converter as letras para caixa alta, no mais, basta ajustá-lo para limitar o tamanho do campo.

Espero que ajude.

aí fabio.sicupira
posta o código ae para a gente ver como ficou…
a sua idéia parece ser muito boa!
valeu, t+++