[RESOLVIDO] JFormattedTextField - atualizar o campo mas sem completar a mascara
4 respostas
K
kerberos2002
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…
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).
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).
K
kerberos2002
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).
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
L
lina
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!
K
kerberos2002
Valeu pessoal
Já resolvi meu problema
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 * */publicclassMaxLengthTextDocumentextendsPlainDocument{/** * */staticfinalintasciiZERO=48;staticfinalintasciiTEN=57;staticfinalintasciiA=65;staticfinalintasciiZ=90;staticfinalintasciia=97;staticfinalintasciiz=122;privatestaticfinallongserialVersionUID=6705227503690881594L;//Store maximum characters permittedprivateintmaxChars;privatebooleanCharAllowed(byte[]arrayASCII){booleanlCheckIsOk=true;for(inti=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;}}returnlCheckIsOk;}publicvoidsetMaxChars(intmaxlen){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 * */@OverridepublicvoidinsertString(intoffs,Stringstr,AttributeSeta)throwsBadLocationException{intilen=(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(UnsupportedEncodingExceptione){// TODO Auto-generated catch blocke.printStackTrace();}// se não é letra nem número, retornaif(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)) StringnewStr=str.substring(0,(maxChars-getLength()));super.insertString(offs,newStr,a);}}}