[RESOLVIDO] JFormattedTextField - atualizar o campo mas sem completar a mascara

Pessoal tenho um campo Nome do tipo JFormattedTextField, eu instanciei corretamente junto com sua mascara (somente letra e numero), porém quero salvar no banco de dados nomes MENORES que o tamanho da mascara que é de 15 caracteres…

.
.
.
       private JFormattedTextField ftfnomeRNA = new  JFormattedTextField();  
    
       MaskFormatter mf2 = null;        

        try {  
            //  
            // Create a MaskFormatter for accepting phone number, the # symbol accept  
            // only a number. We can also set the empty value with a place holder  
            // character.  
            //  
               mf2 = new MaskFormatter("AAAAAAAAAAAAAAA");;        

        } catch (ParseException e) {  
            e.printStackTrace();  
        }

        ftfnomeRNA.setValue(null);
        ftfnomeRNA.setFormatterFactory( new DefaultFormatterFactory( mf2 ) );    

.
.
.

ele funciona OK, SE EU PREENCHO QQ NOME DE 15 CARACTERES, mas se eu preencho por exemplo “ABC” (3 caracteres), e vou para o proximo campo ele volta a mostrar o valor inicial que é vazio.

Como eu faco setar o valor do objeto, se o valor for legal for menor que a máscara ?

Na realidade estou quase voltando para JTextField e implementar uma classe customizada usando PlainDocument, estava lendo em vários fóruns muitas reclamações sobre a usabilidade dessa classe (principalmente para o usuário).

Valeu!

Máscaras são utilizadas quando você define um padrão único que deve ser seguido para a inserção de cada palavra. Se você define uma máscara com “AAAA” você está dizendo que tal String deve conter exatamente 4 caractares alfanuméricos. Então se a String informada não estiver neste padrão, o JFormatterTextField a interpreta como inválida e limpa o campo.

Para resolver, você pode criar o seu Document que faça o tratamento que você precisa, que é limitar o número de caracteres digitados (o que não acontece com uma máscara).

[quote=erico_kl]Máscaras são utilizadas quando você define um padrão único que deve ser seguido para a inserção de cada palavra. Se você define uma máscara com “AAAA” você está dizendo que tal String deve conter exatamente 4 caractares alfanuméricos. Então se a String informada não estiver neste padrão, o JFormatterTextField a interpreta como inválida e limpa o campo.

Para resolver, você pode criar o seu Document que faça o tratamento que você precisa, que é limitar o número de caracteres digitados (o que não acontece com uma máscara).[/quote]

Bom, imaginei que seria assim mesmo, não encontrei nada nos fóruns a vida para “burlar” essa regra, vou partir para customizar uma classe estendida da Document então.

Valeu erico_kl

Oi,

Mascaras são feitas para serem cumpridas. Nada mais justo do que criar uma constraint no banco validando o tamanho da informação a ser gravada.

Tchauzin!

Valeu pessoal
Já resolvi meu problema :smiley:
Criei uma classe extendida da PlainDocument e funcionou direitinho. Alguns trechos eu importei dos tópicos do fórum GUJ que ajudaram bastante (e do blog desse cara, muito bom também http://www.andrels.com )

/**
 * Classe filha de PlainDocument, limita o número máximo de caracteres inseridos 
 * do objeto instanciado da classe JTextField, limita a edição para apenas
 * caracteres alfanumericos (a..z,A..Z,0..9).
 * 
 * @param  - NENHUM 
 * @return - NENHUM
 * 
 */ 
public class MaxLengthTextDocument extends PlainDocument {
	/**
	 * 
	 */
	static final int asciiZERO   = 48;
	static final int asciiTEN     = 57;
	static final int asciiA         = 65;
	static final int asciiZ         = 90;
	static final int asciia         = 97;
	static final int asciiz         = 122;
    
	private static final long serialVersionUID = 6705227503690881594L;
	//Store maximum characters permitted
	private int maxChars;
  
    private boolean CharAllowed( byte[] arrayASCII ) { 
    	
    	boolean lCheckIsOk = true;
    	
    	for (int i = 0; i < arrayASCII.length; i++) {
    		
    		 if ( !( ( arrayASCII[i] >= asciiZERO && arrayASCII[i] <= asciiTEN)  || 
    			     ( arrayASCII[i] >= asciiA && arrayASCII[i] <= asciiZ )  ||
    			     ( arrayASCII[i] >= asciia && arrayASCII[i] <= asciiz ) ) ) {
    			 
    			 JOptionPane.showMessageDialog(null,"Caracteres permitidos são letras e números.","Aviso",
    				      JOptionPane.WARNING_MESSAGE);
    			 lCheckIsOk = false;
    		 }
    	}  
    	return lCheckIsOk;}

    public void setMaxChars(int maxlen) {    
    	maxChars = maxlen;    
    }
    
    /**
     * Le o caracter ou conjunto de caracteres digitados e verifica se 
     * do objeto instanciado da classe JTextField, limita a edição para apenas
     * caracteres alfanumericos (a..z,A..Z,0..9). Overide da funcao InsertString 
     * da classe PlainDocument
     * 
     * @param  - offs 
     * @param  - str
     * @param  - a 
     * @return - NENHUM
     * */ 
    @Override    
        public void insertString(int offs, String str, AttributeSet a)
        throws BadLocationException {   
         
    	int ilen = (getLength() + str.length());
    	// calcula o tamanho do campo + texto texto inserido (pode ser 1 caracter ou ctrl-v)
    	
    	try {
			byte[] byteTexto = str.getBytes("US-ASCII");
	    	
			if ( !CharAllowed( byteTexto ) ) return;
	    	

		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	// se não é letra nem número, retorna
    	
    	if(str != null && ilen < maxChars) {    
        super.insertString(offs, str, a);      // se nova string < tamanho máx, nada a fazer 
         }    
    	else
        {  
            if (getLength() == maxChars) return; // se nova string exatamente igual a tamanhom máximo nada a fazer  
            // se for maior, insere a diferenca (max - tam(control-v)) 
            String newStr = str.substring(0, (maxChars - getLength()));  
      
            super.insertString(offs, newStr, a);    
        }
        }
    
}